public async Task <IActionResult> Post([FromBody] InventoryDocumentViewModel viewModel)
        {
            try
            {
                VerifyUser();
                ValidateService.Validate(viewModel);

                InventoryDocument model = Service.MapToModel(viewModel);
                await Service.Create(model);

                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.CREATED_STATUS_CODE, General.OK_MESSAGE)
                    .Ok();
                return(Created(String.Concat(Request.Path, "/", 0), Result));
            }
            catch (ServiceValidationExeption e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.BAD_REQUEST_STATUS_CODE, General.BAD_REQUEST_MESSAGE)
                    .Fail(e);
                return(BadRequest(Result));
            }
            catch (Exception e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
                    .Fail();
                return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, Result));
            }
        }
        public IActionResult GetById(int id)
        {
            try
            {
                var indexAcceptPdf = Request.Headers["Accept"].ToList().IndexOf("application/pdf");

                InventoryDocument model = Service.ReadModelById(id);

                if (model == null)
                {
                    Dictionary <string, object> Result =
                        new ResultFormatter(ApiVersion, General.NOT_FOUND_STATUS_CODE, General.NOT_FOUND_MESSAGE)
                        .Fail();
                    return(NotFound(Result));
                }
                else
                {
                    Dictionary <string, object> Result =
                        new ResultFormatter(ApiVersion, General.OK_STATUS_CODE, General.OK_MESSAGE)
                        .Ok <InventoryDocument, InventoryDocumentViewModel>(model, Service.MapToViewModel);
                    return(Ok(Result));
                }
            }
            catch (Exception e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
                    .Fail();
                return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, Result));
            }
        }
        public async void Should_Success_Create_Data()
        {
            InventoryDocument model = DataUtil.GetNewData();
            var Response            = await Facade.Create(model, "Unit Test");

            Assert.NotEqual(Response, 0);
        }
        string GenerateNo(InventoryDocument model)
        {
            do
            {
                model.No = CodeGenerator.GenerateCode();
            }while (this.dbSet.Any(d => d.No.Equals(model.No)));

            return(model.No);
            //string Year = model.Date.ToString("yy");
            //string Month = model.Date.ToString("MM");



            //string no = $"DOC-{Year}-{Month}-{model.StorageCode}-";
            //int Padding = 7;

            //var lastNo = await this.dbSet.Where(w => w.No.StartsWith(no) && !w._IsDeleted).OrderByDescending(o => o.No).FirstOrDefaultAsync();

            //if (lastNo == null)
            //{
            //    return no + "1".PadLeft(Padding, '0');
            //}
            //else
            //{
            //    int lastNoNumber = Int32.Parse(lastNo.No.Replace(no, "")) + 1;
            //    return no + lastNoNumber.ToString().PadLeft(Padding, '0');
            //}
        }
Beispiel #5
0
        public async Task <int> CreateInventoryDocumentAsync(Models.FpRegradingResultDocs Model, string Type)
        {
            string       storageURI = "master/storages";
            string       uomURI     = "master/uoms";
            IHttpService httpClient = (IHttpService)this.ServiceProvider.GetService(typeof(IHttpService));

            /* Get UOM */
            Dictionary <string, object> filterUOM = new Dictionary <string, object> {
                { "unit", "MTR" }
            };
            var responseUOM = httpClient.GetAsync($@"{APIEndpoint.Core}{uomURI}?filter=" + JsonConvert.SerializeObject(filterUOM)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultUOM = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseUOM.Result);
            var jsonUOM = resultUOM.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> uom = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonUOM.ToString())[0];

            /* Get Storage */
            var storageName = Model.UnitName.Equals("PRINTING") ? "Gudang Greige Printing" : "Gudang Greige Finishing";
            Dictionary <string, object> filterStorage = new Dictionary <string, object> {
                { "name", storageName }
            };
            var responseStorage = httpClient.GetAsync($@"{APIEndpoint.Core}{storageURI}?filter=" + JsonConvert.SerializeObject(filterStorage)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultStorage = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseStorage.Result);
            var jsonStorage = resultStorage.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> storage = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonStorage.ToString())[0];

            /* Create Inventory Document */
            List <InventoryDocumentItem> inventoryDocumentItems = new List <InventoryDocumentItem>();
            InventoryDocumentItem        inventoryDocumentItem  = new InventoryDocumentItem();
            double TotalLength = 0;

            foreach (FpRegradingResultDocsDetails o in Model.Details)
            {
                TotalLength += o.Length;
            }

            inventoryDocumentItem.ProductId   = int.Parse(Model.ProductId);
            inventoryDocumentItem.ProductCode = Model.ProductCode;
            inventoryDocumentItem.ProductName = Model.ProductName;
            inventoryDocumentItem.Quantity    = TotalLength;
            inventoryDocumentItem.UomId       = int.Parse(uom["Id"].ToString());
            inventoryDocumentItem.UomUnit     = uom["Unit"].ToString();

            inventoryDocumentItems.Add(inventoryDocumentItem);

            InventoryDocument inventoryDocument = new InventoryDocument
            {
                Date          = DateTimeOffset.UtcNow,
                ReferenceNo   = Model.Code,
                ReferenceType = "Bon Hasil Re-grading",
                Type          = Type,
                StorageId     = int.Parse(storage["_id"].ToString()),
                StorageCode   = storage["code"].ToString(),
                StorageName   = storage["name"].ToString(),
                Items         = inventoryDocumentItems
            };

            var inventoryDocumentFacade = ServiceProvider.GetService <IInventoryDocumentService>();

            return(await inventoryDocumentFacade.Create(inventoryDocument));
        }
Beispiel #6
0
        public async Task <InventoryDocument> GetTestData()
        {
            InventoryDocument invDoc = GetNewData();

            await _inventoryDocumentRepository.Create(invDoc);

            return(invDoc);
        }
Beispiel #7
0
        public async Task <InventoryDocument> GetTestData()
        {
            InventoryDocument invDoc = GetNewData();

            await Service.Create(invDoc);

            return(invDoc);
        }
        public async void Should_Success_Get_Data_By_Id()
        {
            InventoryDocument model = await DataUtil.GetTestData("Unit test");

            var Response = Facade.ReadModelById((int)model.Id);

            Assert.NotNull(Response);
        }
Beispiel #9
0
        public async Task <InventoryDocument> GetTestData(string user)
        {
            InventoryDocument invDoc = GetNewData();

            await facade.Create(invDoc, user);

            return(invDoc);
        }
        private string GenerateNo(InventoryDocument model)
        {
            do
            {
                model.No = CodeGenerator.GenerateCode();
            }while (this._dbSet.Any(d => d.No.Equals(model.No)));

            return(model.No);
        }
Beispiel #11
0
        public IActionResult Get(int id)
        {
            try
            {
                var indexAcceptPdf = Request.Headers["Accept"].ToList().IndexOf("application/pdf");

                InventoryDocument model = _facade.ReadModelById(id);
                //InventoryDocumentViewModel viewModel = _mapper.Map<InventoryDocumentViewModel>(model);
                List <InventoryDocumentItemViewModel> items = new List <InventoryDocumentItemViewModel>();
                foreach (var item in model.Items)
                {
                    items.Add(new InventoryDocumentItemViewModel
                    {
                        productCode   = item.ProductCode,
                        productId     = item.ProductId,
                        productName   = item.ProductName,
                        remark        = item.ProductRemark,
                        quantity      = item.Quantity,
                        stockPlanning = item.StockPlanning,
                        uomId         = item.UomId,
                        uom           = item.UomUnit,
                    });
                }
                InventoryDocumentViewModel viewModel = new InventoryDocumentViewModel
                {
                    referenceNo   = model.ReferenceNo,
                    referenceType = model.ReferenceType,
                    remark        = model.Remark,
                    storageCode   = model.StorageCode,
                    storageId     = model.StorageId.ToString(),
                    storageName   = model.StorageName,
                    date          = model.Date,
                    type          = model.Type,
                    items         = items
                };
                if (viewModel == null)
                {
                    throw new Exception("Invalid Id");
                }

                return(Ok(new
                {
                    apiVersion = ApiVersion,
                    statusCode = General.OK_STATUS_CODE,
                    message = General.OK_MESSAGE,
                    data = viewModel,
                }));
            }
            catch (Exception e)
            {
                Dictionary <string, object> Result =
                    new ResultFormatter(ApiVersion, General.INTERNAL_ERROR_STATUS_CODE, e.Message)
                    .Fail();
                return(StatusCode(General.INTERNAL_ERROR_STATUS_CODE, Result));
            }
        }
Beispiel #12
0
        // Generate SignalR Message
        private static string GenerateInventoryMessage(InventoryDocument document)
        {
            var message = new JObject();

            message["Product"] = document.id;
            foreach (var location in document.stock)
            {
                message[location.Key] = location.Value;
            }
            return(message.ToString());
        }
Beispiel #13
0
        public override InventorySheet CreateNew()
        {
            InventoryDocument parent = (InventoryDocument)this.Parent;

            //create new object and attach it to the element
            InventorySheet line = new InventorySheet(parent);

            line.Order = this.Children.Count + 1;

            //add object to the collection
            this.Children.Add(line);

            return(line);
        }
Beispiel #14
0
        public static void CreateInventorySheetToInventoryDocument(InventorySheet destination, XElement source)
        {
            Guid inventoryDocumentId = new Guid(source.Element("inventoryDocumentId").Value);

            destination.InventoryDocumentHeaderId = inventoryDocumentId;

            using (DocumentCoordinator c = new DocumentCoordinator(false, false))
            {
                InventoryDocument inventoryDocument = (InventoryDocument)c.LoadBusinessObject(BusinessObjectType.InventoryDocument, inventoryDocumentId);
                destination.Tag           = inventoryDocument.Version.ToUpperString();
                destination.OrdinalNumber = inventoryDocument.Sheets.Children.Count + 1;
                destination.InventoryDocumentFullNumber = inventoryDocument.Number.FullNumber;
                destination.WarehouseId = inventoryDocument.WarehouseId;
            }
        }
Beispiel #15
0
 public void SaveInventory(string characterID, ServerInventory serverInventory)
 {
     lock (sync) {
         log.InfoFormat("SAVE INVENTORY FOR CHAR = {0}  INV COUNT = {1} [red]", characterID, serverInventory.SlotsUsed);
         var document = InventoryDocuments.FindOne(Query <InventoryDocument> .EQ(d => d.CharacterId, characterID));
         if (document == null)
         {
             document = new InventoryDocument {
                 CharacterId = characterID
             };
         }
         document.Set(serverInventory);
         InventoryDocuments.Save(document);
     }
 }
        private async Task CreateInventory(FpReturnFromBuyerModel model, string type)
        {
            var inventoryDocument = new InventoryDocument()
            {
                Date          = model.Date,
                Items         = GetInventoryItems(model.Details),
                ReferenceNo   = model.Code,
                ReferenceType = "Return From Buyer",
                StorageCode   = model.StorageCode,
                StorageId     = model.StorageId,
                StorageName   = model.StorageName,
                Type          = type
            };

            await _inventoryDocumentService.Create(inventoryDocument);
        }
Beispiel #17
0
 public ServerInventory LoadInventory(string characterID, Res resource)
 {
     lock (sync) {
         log.InfoFormat("LOAD INVENTORY FOR CHAR = {0} [red]", characterID);
         var document = InventoryDocuments.FindOne(Query <InventoryDocument> .EQ(d => d.CharacterId, characterID));
         if (document != null)
         {
             return(document.SourceObject(resource));
         }
         else
         {
             document = new InventoryDocument {
                 CharacterId = characterID, Items = new List <InventoryItemDocumentElement>(), MaxSlots = 0
             };
             InventoryDocuments.Save(document);
             return(document.SourceObject(resource));
         }
     }
 }
        async Task <string> GenerateNo(InventoryDocument model)
        {
            string Year  = model.Date.ToString("yy");
            string Month = model.Date.ToString("MM");


            string no      = $"DOC-{Year}-{Month}-{model.StorageCode}-{model.ReferenceType}-";
            int    Padding = 7;

            var lastNo = await this.dbSet.Where(w => w.No.StartsWith(no) && !w._IsDeleted).OrderByDescending(o => o.No).FirstOrDefaultAsync();

            if (lastNo == null)
            {
                return(no + "1".PadLeft(Padding, '0'));
            }
            else
            {
                int lastNoNumber = Int32.Parse(lastNo.No.Replace(no, "")) + 1;
                return(no + lastNoNumber.ToString().PadLeft(Padding, '0'));
            }
        }
        public async Task <int> CreateInventoryDocument(StockTransferNote Model, string Type, string Context)
        {
            StockTransferNoteViewModel ViewModel = MapToViewModel(Model);

            IHttpServiceRepository httpClient = (IHttpServiceRepository)this.ServiceProvider.GetService(typeof(IHttpServiceRepository));

            /* Create Inventory Document */
            List <InventoryDocumentItem> inventoryDocumentItems = new List <InventoryDocumentItem>();

            foreach (StockTransferNoteItemViewModel stni in ViewModel.StockTransferNoteItems)
            {
                InventoryDocumentItem inventoryDocumentItem = new InventoryDocumentItem
                {
                    ProductId   = stni.Summary.ProductId,
                    ProductCode = stni.Summary.ProductCode,
                    ProductName = stni.Summary.ProductName,
                    Quantity    = stni.TransferedQuantity != null ? (double)stni.TransferedQuantity : 0,
                    UomId       = stni.Summary.UomId,
                    UomUnit     = stni.Summary.Uom
                };

                inventoryDocumentItems.Add(inventoryDocumentItem);
            }

            InventoryDocument inventoryDocument = new InventoryDocument
            {
                Date          = DateTimeOffset.UtcNow,
                ReferenceNo   = Model.ReferenceNo,
                ReferenceType = Model.ReferenceType,
                Type          = Type,
                StorageId     = string.Equals(Context.ToUpper(), "CREATE") || string.Equals(Context.ToUpper(), "DELETE-SOURCE") ? int.Parse(Model.SourceStorageId) : int.Parse(Model.TargetStorageId),
                StorageCode   = string.Equals(Context.ToUpper(), "CREATE") || string.Equals(Context.ToUpper(), "DELETE-SOURCE") ? Model.SourceStorageCode : Model.TargetStorageCode,
                StorageName   = string.Equals(Context.ToUpper(), "CREATE") || string.Equals(Context.ToUpper(), "DELETE-SOURCE") ? Model.SourceStorageName : Model.TargetStorageName,
                Items         = inventoryDocumentItems
            };

            var inventoryDocumentFacade = ServiceProvider.GetService <IInventoryDocumentRepository>();

            return(await inventoryDocumentFacade.Create(inventoryDocument));
        }
        public InventoryDocumentViewModel MapToViewModel(InventoryDocument model)
        {
            InventoryDocumentViewModel viewModel = new InventoryDocumentViewModel
            {
                No            = model.No,
                ReferenceNo   = model.ReferenceNo,
                ReferenceType = model.ReferenceType,
                Remark        = model.Remark,
                StorageCode   = model.StorageCode,
                StorageId     = model.StorageId,
                StorageName   = model.StorageName,
                Date          = model.Date,
                Type          = model.Type,
                Items         = model.Items.Select(item => new InventoryDocumentItemViewModel()
                {
                    Id                = item.Id,
                    Active            = item.Active,
                    CreatedAgent      = item.CreatedAgent,
                    CreatedBy         = item.CreatedBy,
                    CreatedUtc        = item.CreatedUtc,
                    IsDeleted         = item.IsDeleted,
                    LastModifiedAgent = item.LastModifiedAgent,
                    LastModifiedBy    = item.LastModifiedBy,
                    LastModifiedUtc   = item.LastModifiedUtc,
                    ProductCode       = item.ProductCode,
                    ProductId         = item.ProductId,
                    ProductName       = item.ProductName,
                    Remark            = item.ProductRemark,
                    Quantity          = item.Quantity,
                    StockPlanning     = item.StockPlanning,
                    UomId             = item.UomId,
                    Uom               = item.UomUnit,
                }).ToList()
            };

            PropertyCopier <InventoryDocument, InventoryDocumentViewModel> .Copy(model, viewModel);

            return(viewModel);
        }
        public InventoryDocumentViewModel MapToViewModel(InventoryDocument model)
        {
            InventoryDocumentViewModel viewModel = new InventoryDocumentViewModel
            {
                no            = model.No,
                referenceNo   = model.ReferenceNo,
                referenceType = model.ReferenceType,
                remark        = model.Remark,
                storageCode   = model.StorageCode,
                storageId     = model.StorageId,
                storageName   = model.StorageName,
                date          = model.Date,
                type          = model.Type,
                items         = model.Items.Select(item => new InventoryDocumentItemViewModel()
                {
                    Id                 = item.Id,
                    Active             = item.Active,
                    _CreatedAgent      = item._CreatedAgent,
                    _CreatedBy         = item._CreatedBy,
                    _CreatedUtc        = item._CreatedUtc,
                    _IsDeleted         = item._IsDeleted,
                    _LastModifiedAgent = item._LastModifiedAgent,
                    _LastModifiedBy    = item._LastModifiedBy,
                    _LastModifiedUtc   = item._LastModifiedUtc,
                    productCode        = item.ProductCode,
                    productId          = item.ProductId,
                    productName        = item.ProductName,
                    remark             = item.ProductRemark,
                    quantity           = item.Quantity,
                    stockPlanning      = item.StockPlanning,
                    uomId              = item.UomId,
                    uom                = item.UomUnit,
                }).ToList()
            };

            PropertyCopier <InventoryDocument, InventoryDocumentViewModel> .Copy(model, viewModel);

            return(viewModel);
        }
        public InventoryDocument MapToModel(InventoryDocumentViewModel viewModel)
        {
            InventoryDocument model = new InventoryDocument
            {
                ReferenceNo   = viewModel.referenceNo,
                ReferenceType = viewModel.referenceType,
                Remark        = viewModel.remark,
                StorageCode   = viewModel.storageCode,
                StorageId     = Convert.ToInt32(viewModel.storageId),
                StorageName   = viewModel.storageName,
                Date          = viewModel.date,
                Type          = viewModel.type,
                Items         = viewModel.items.Select(item => new InventoryDocumentItem()
                {
                    Id                 = item.Id,
                    Active             = item.Active,
                    _CreatedAgent      = item._CreatedAgent,
                    _CreatedBy         = item._CreatedBy,
                    _CreatedUtc        = item._CreatedUtc,
                    _IsDeleted         = item._IsDeleted,
                    _LastModifiedAgent = item._LastModifiedAgent,
                    _LastModifiedBy    = item._LastModifiedBy,
                    _LastModifiedUtc   = item._LastModifiedUtc,
                    ProductCode        = item.productCode,
                    ProductId          = item.productId,
                    ProductName        = item.productName,
                    ProductRemark      = item.remark,
                    Quantity           = item.quantity,
                    StockPlanning      = item.stockPlanning,
                    UomId              = item.uomId,
                    UomUnit            = item.uom,
                }).ToList()
            };

            PropertyCopier <InventoryDocumentViewModel, InventoryDocument> .Copy(viewModel, model);

            return(model);
        }
Beispiel #23
0
        public override void UpdateNodes()
        {
            IncomingInvoice              invoiceAlias          = null;
            IncomingWater                waterAlias            = null;
            MovementDocument             movementAlias         = null;
            WriteoffDocument             writeoffAlias         = null;
            InventoryDocument            inventoryAlias        = null;
            ShiftChangeWarehouseDocument shiftchangeAlias      = null;
            SelfDeliveryDocument         selfDeliveryAlias     = null;
            RegradingOfGoodsDocument     regradingOfGoodsAlias = null;
            DocumentVMNode               resultAlias           = null;
            Counterparty  counterpartyAlias       = null;
            Counterparty  secondCounterpartyAlias = null;
            Warehouse     warehouseAlias          = null;
            Warehouse     secondWarehouseAlias    = null;
            MovementWagon wagonAlias = null;

            Nomenclature productAlias = null;

            CarLoadDocument   loadCarAlias   = null;
            CarUnloadDocument unloadCarAlias = null;
            RouteList         routeListAlias = null;
            Car      carAlias        = null;
            Employee driverAlias     = null;
            Employee authorAlias     = null;
            Employee lastEditorAlias = null;

            Domain.Orders.Order orderAlias = null;

            List <DocumentVMNode> result = new List <DocumentVMNode> ();

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.IncomingInvoice) && Filter.RestrictDriver == null)
            {
                var invoiceQuery = UoW.Session.QueryOver <IncomingInvoice>(() => invoiceAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    invoiceQuery.Where(x => x.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    invoiceQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    invoiceQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var invoiceList = invoiceQuery.JoinQueryOver(() => invoiceAlias.Contractor, () => counterpartyAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .JoinQueryOver(() => invoiceAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .JoinAlias(() => invoiceAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .JoinAlias(() => invoiceAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .SelectList(list => list
                                              .Select(() => invoiceAlias.Id).WithAlias(() => resultAlias.Id)
                                              .Select(() => invoiceAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                              .Select(() => invoiceAlias.Comment).WithAlias(() => resultAlias.Comment)
                                              .Select(() => DocumentType.IncomingInvoice).WithAlias(() => resultAlias.DocTypeEnum)
                                              .Select(Projections.Conditional(
                                                          Restrictions.Where(() => counterpartyAlias.Name == null),
                                                          Projections.Constant("Не указан", NHibernateUtil.String),
                                                          Projections.Property(() => counterpartyAlias.Name)))
                                              .WithAlias(() => resultAlias.Counterparty)
                                              .Select(Projections.Conditional(
                                                          Restrictions.Where(() => warehouseAlias.Name == null),
                                                          Projections.Constant("Не указан", NHibernateUtil.String),
                                                          Projections.Property(() => warehouseAlias.Name)))
                                              .WithAlias(() => resultAlias.Warehouse)
                                              .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                              .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                              .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                              .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                              .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                              .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                              .Select(() => invoiceAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime)
                                              )
                                  .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                  .List <DocumentVMNode> ();

                result.AddRange(invoiceList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.IncomingWater) && Filter.RestrictDriver == null)
            {
                var waterQuery = UoW.Session.QueryOver <IncomingWater>(() => waterAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    waterQuery.Where(x => x.IncomingWarehouse.Id == Filter.RestrictWarehouse.Id || x.WriteOffWarehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    waterQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    waterQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var waterList = waterQuery
                                .JoinQueryOver(() => waterAlias.IncomingWarehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                .JoinAlias(() => waterAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                .JoinAlias(() => waterAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                .Left.JoinAlias(() => waterAlias.Product, () => productAlias)
                                .SelectList(list => list
                                            .Select(() => waterAlias.Id).WithAlias(() => resultAlias.Id)
                                            .Select(() => waterAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                            .Select(() => DocumentType.IncomingWater).WithAlias(() => resultAlias.DocTypeEnum)
                                            .Select(Projections.Conditional(
                                                        Restrictions.Where(() => warehouseAlias.Name == null),
                                                        Projections.Constant("Не указан", NHibernateUtil.String),
                                                        Projections.Property(() => warehouseAlias.Name)))
                                            .WithAlias(() => resultAlias.Warehouse)
                                            .Select(() => productAlias.Name).WithAlias(() => resultAlias.ProductName)
                                            .Select(() => waterAlias.Amount).WithAlias(() => resultAlias.Amount)
                                            .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                            .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                            .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                            .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                            .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                            .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                            .Select(() => waterAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                .List <DocumentVMNode> ();

                result.AddRange(waterList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.MovementDocument) && Filter.RestrictDriver == null)
            {
                var movementQuery = UoW.Session.QueryOver <MovementDocument>(() => movementAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    movementQuery.Where(x => x.FromWarehouse.Id == Filter.RestrictWarehouse.Id || x.ToWarehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    movementQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    movementQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }
                if (Filter.RestrictMovementStatus.HasValue && Filter.RestrictDocumentType == DocumentType.MovementDocument)
                {
                    movementQuery.Where(o => o.Status == Filter.RestrictMovementStatus.Value);
                }

                var movementList = movementQuery
                                   .JoinQueryOver(() => movementAlias.FromWarehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinQueryOver(() => movementAlias.ToWarehouse, () => secondWarehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinAlias(() => movementAlias.MovementWagon, () => wagonAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinAlias(() => movementAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinAlias(() => movementAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .SelectList(list => list
                                               .Select(() => movementAlias.Id).WithAlias(() => resultAlias.Id)
                                               .Select(() => movementAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                               .Select(() => DocumentType.MovementDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                               .Select(() => movementAlias.Status).WithAlias(() => resultAlias.MovementDocumentStatus)
                                               .Select(() => movementAlias.HasDiscrepancy).WithAlias(() => resultAlias.MovementDocumentDiscrepancy)
                                               .Select(() => wagonAlias.Name).WithAlias(() => resultAlias.CarNumber)
                                               .Select(Projections.Conditional(
                                                           Restrictions.Where(() => warehouseAlias.Name == null),
                                                           Projections.Constant("Не указан", NHibernateUtil.String),
                                                           Projections.Property(() => warehouseAlias.Name)))
                                               .WithAlias(() => resultAlias.Warehouse)
                                               .Select(Projections.Conditional(
                                                           Restrictions.Where(() => secondWarehouseAlias.Name == null),
                                                           Projections.Constant("Не указан", NHibernateUtil.String),
                                                           Projections.Property(() => secondWarehouseAlias.Name)))
                                               .WithAlias(() => resultAlias.SecondWarehouse)
                                               .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                               .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                               .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                               .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                               .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                               .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                               .Select(() => movementAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                   .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                   .List <DocumentVMNode> ();

                result.AddRange(movementList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.WriteoffDocument) && Filter.RestrictDriver == null)
            {
                var writeoffQuery = UoW.Session.QueryOver <WriteoffDocument>(() => writeoffAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    writeoffQuery.Where(x => x.WriteoffWarehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    writeoffQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    writeoffQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var writeoffList = writeoffQuery
                                   .JoinQueryOver(() => writeoffAlias.Client, () => counterpartyAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinQueryOver(() => writeoffAlias.WriteoffWarehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinAlias(() => writeoffAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinAlias(() => writeoffAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .SelectList(list => list
                                               .Select(() => writeoffAlias.Id).WithAlias(() => resultAlias.Id)
                                               .Select(() => writeoffAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                               .Select(() => DocumentType.WriteoffDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                               .Select(Projections.Conditional(
                                                           Restrictions.Where(() => counterpartyAlias.Name == null),
                                                           Projections.Constant(string.Empty, NHibernateUtil.String),
                                                           Projections.Property(() => counterpartyAlias.Name)))
                                               .WithAlias(() => resultAlias.Counterparty)
                                               .Select(Projections.Conditional(
                                                           Restrictions.Where(() => warehouseAlias.Name == null),
                                                           Projections.Constant(string.Empty, NHibernateUtil.String),
                                                           Projections.Property(() => warehouseAlias.Name)))
                                               .WithAlias(() => resultAlias.Warehouse)
                                               .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                               .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                               .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                               .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                               .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                               .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                               .Select(() => writeoffAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                   .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                   .List <DocumentVMNode> ();

                result.AddRange(writeoffList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.InventoryDocument) && Filter.RestrictDriver == null)
            {
                var inventoryQuery = UoW.Session.QueryOver <InventoryDocument>(() => inventoryAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    inventoryQuery.Where(x => x.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    inventoryQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    inventoryQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var inventoryList = inventoryQuery
                                    .JoinQueryOver(() => inventoryAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                    .JoinAlias(() => inventoryAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                    .JoinAlias(() => inventoryAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                    .SelectList(list => list
                                                .Select(() => inventoryAlias.Id).WithAlias(() => resultAlias.Id)
                                                .Select(() => inventoryAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                                .Select(() => DocumentType.InventoryDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                                .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                                .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                                .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                                .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                                .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                                .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                                .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                                .Select(() => inventoryAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                    .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                    .List <DocumentVMNode> ();

                result.AddRange(inventoryList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.ShiftChangeDocument) && Filter.RestrictDriver == null)
            {
                var shiftchangeQuery = UoW.Session.QueryOver <ShiftChangeWarehouseDocument>(() => shiftchangeAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    shiftchangeQuery.Where(x => x.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    shiftchangeQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    shiftchangeQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var shiftchangeList = shiftchangeQuery
                                      .JoinQueryOver(() => shiftchangeAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                      .JoinAlias(() => shiftchangeAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                      .JoinAlias(() => shiftchangeAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                      .SelectList(list => list
                                                  .Select(() => shiftchangeAlias.Id).WithAlias(() => resultAlias.Id)
                                                  .Select(() => shiftchangeAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                                  .Select(() => DocumentType.ShiftChangeDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                                  .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                                  .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                                  .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                                  .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                                  .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                                  .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                                  .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                                  .Select(() => shiftchangeAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                      .TransformUsing(Transformers.AliasToBean <DocumentVMNode>())
                                      .List <DocumentVMNode>();

                result.AddRange(shiftchangeList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.RegradingOfGoodsDocument) && Filter.RestrictDriver == null)
            {
                var regrandingQuery = UoW.Session.QueryOver <RegradingOfGoodsDocument>(() => regradingOfGoodsAlias);
                if (Filter.RestrictWarehouse != null)
                {
                    regrandingQuery.Where(x => x.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    regrandingQuery.Where(o => o.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    regrandingQuery.Where(o => o.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var regrandingList = regrandingQuery
                                     .JoinQueryOver(() => regradingOfGoodsAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .JoinAlias(() => regradingOfGoodsAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .JoinAlias(() => regradingOfGoodsAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .SelectList(list => list
                                                 .Select(() => regradingOfGoodsAlias.Id).WithAlias(() => resultAlias.Id)
                                                 .Select(() => regradingOfGoodsAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                                 .Select(() => DocumentType.RegradingOfGoodsDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                                 .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                                 .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                                 .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                                 .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                                 .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                                 .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                                 .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                                 .Select(() => regradingOfGoodsAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                     .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                     .List <DocumentVMNode> ();

                result.AddRange(regrandingList);
            }

            if ((Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.SelfDeliveryDocument) && Filter.RestrictDriver == null)
            {
                var selfDeliveryQuery = UoW.Session.QueryOver <SelfDeliveryDocument>(() => selfDeliveryAlias)
                                        .JoinQueryOver(() => selfDeliveryAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                        .JoinQueryOver(() => selfDeliveryAlias.Order, () => orderAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                        .JoinQueryOver(() => orderAlias.Client, () => counterpartyAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

                if (Filter.RestrictWarehouse != null)
                {
                    selfDeliveryQuery.Where(() => selfDeliveryAlias.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    selfDeliveryQuery.Where(() => selfDeliveryAlias.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    selfDeliveryQuery.Where(() => selfDeliveryAlias.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }

                var selfDeliveryList = selfDeliveryQuery
                                       .JoinAlias(() => selfDeliveryAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                       .JoinAlias(() => selfDeliveryAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                       .SelectList(list => list
                                                   .Select(() => selfDeliveryAlias.Id).WithAlias(() => resultAlias.Id)
                                                   .Select(() => orderAlias.Id).WithAlias(() => resultAlias.OrderId)
                                                   .Select(() => selfDeliveryAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                                   .Select(() => DocumentType.SelfDeliveryDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                                   .Select(() => counterpartyAlias.Name).WithAlias(() => resultAlias.Counterparty)
                                                   .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                                   .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                                   .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                                   .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                                   .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                                   .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                                   .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                                   .Select(() => selfDeliveryAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                       .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                       .List <DocumentVMNode> ();

                result.AddRange(selfDeliveryList);
            }

            if (Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.CarLoadDocument)
            {
                var carLoadQuery = UoW.Session.QueryOver <CarLoadDocument>(() => loadCarAlias)
                                   .JoinQueryOver(() => loadCarAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinQueryOver(() => loadCarAlias.RouteList, () => routeListAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinQueryOver(() => routeListAlias.Car, () => carAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .JoinQueryOver(() => routeListAlias.Driver, () => driverAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

                if (Filter.RestrictWarehouse != null)
                {
                    carLoadQuery.Where(() => loadCarAlias.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    carLoadQuery.Where(() => loadCarAlias.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    carLoadQuery.Where(() => loadCarAlias.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }
                if (Filter.RestrictDriver != null)
                {
                    carLoadQuery.Where(() => routeListAlias.Driver.Id == Filter.RestrictDriver.Id);
                }

                var carLoadList = carLoadQuery
                                  .JoinAlias(() => loadCarAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .JoinAlias(() => loadCarAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                  .SelectList(list => list
                                              .Select(() => loadCarAlias.Id).WithAlias(() => resultAlias.Id)
                                              .Select(() => loadCarAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                              .Select(() => DocumentType.CarLoadDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                              .Select(() => carAlias.Model).WithAlias(() => resultAlias.CarModel)
                                              .Select(() => carAlias.RegistrationNumber).WithAlias(() => resultAlias.CarNumber)
                                              .Select(() => driverAlias.LastName).WithAlias(() => resultAlias.DirverSurname)
                                              .Select(() => driverAlias.Name).WithAlias(() => resultAlias.DirverName)
                                              .Select(() => driverAlias.Patronymic).WithAlias(() => resultAlias.DirverPatronymic)
                                              .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                              .Select(() => routeListAlias.Id).WithAlias(() => resultAlias.RouteListId)
                                              .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                              .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                              .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                              .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                              .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                              .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                              .Select(() => loadCarAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                  .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                  .List <DocumentVMNode> ();

                result.AddRange(carLoadList);
            }

            if (Filter.RestrictDocumentType == null || Filter.RestrictDocumentType == DocumentType.CarUnloadDocument)
            {
                var carUnloadQuery = UoW.Session.QueryOver <CarUnloadDocument>(() => unloadCarAlias)
                                     .JoinQueryOver(() => unloadCarAlias.Warehouse, () => warehouseAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .JoinQueryOver(() => unloadCarAlias.RouteList, () => routeListAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .JoinQueryOver(() => routeListAlias.Car, () => carAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                     .JoinQueryOver(() => routeListAlias.Driver, () => driverAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

                if (Filter.RestrictWarehouse != null)
                {
                    carUnloadQuery.Where(() => unloadCarAlias.Warehouse.Id == Filter.RestrictWarehouse.Id);
                }
                if (Filter.RestrictStartDate.HasValue)
                {
                    carUnloadQuery.Where(() => unloadCarAlias.TimeStamp >= Filter.RestrictStartDate.Value);
                }
                if (Filter.RestrictEndDate.HasValue)
                {
                    carUnloadQuery.Where(() => unloadCarAlias.TimeStamp < Filter.RestrictEndDate.Value.AddDays(1));
                }
                if (Filter.RestrictDriver != null)
                {
                    carUnloadQuery.Where(() => routeListAlias.Driver.Id == Filter.RestrictDriver.Id);
                }

                var carUnloadList = carUnloadQuery
                                    .JoinAlias(() => unloadCarAlias.Author, () => authorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                    .JoinAlias(() => unloadCarAlias.LastEditor, () => lastEditorAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                    .SelectList(list => list
                                                .Select(() => unloadCarAlias.Id).WithAlias(() => resultAlias.Id)
                                                .Select(() => unloadCarAlias.TimeStamp).WithAlias(() => resultAlias.Date)
                                                .Select(() => DocumentType.CarUnloadDocument).WithAlias(() => resultAlias.DocTypeEnum)
                                                .Select(() => carAlias.Model).WithAlias(() => resultAlias.CarModel)
                                                .Select(() => carAlias.RegistrationNumber).WithAlias(() => resultAlias.CarNumber)
                                                .Select(() => driverAlias.LastName).WithAlias(() => resultAlias.DirverSurname)
                                                .Select(() => driverAlias.Name).WithAlias(() => resultAlias.DirverName)
                                                .Select(() => driverAlias.Patronymic).WithAlias(() => resultAlias.DirverPatronymic)
                                                .Select(() => warehouseAlias.Name).WithAlias(() => resultAlias.Warehouse)
                                                .Select(() => routeListAlias.Id).WithAlias(() => resultAlias.RouteListId)
                                                .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorSurname)
                                                .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                                .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                                .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorSurname)
                                                .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                                .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                                .Select(() => unloadCarAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime))
                                    .TransformUsing(Transformers.AliasToBean <DocumentVMNode> ())
                                    .List <DocumentVMNode> ();

                result.AddRange(carUnloadList);
            }

            result.Sort((x, y) => {
                if (x.Date < y.Date)
                {
                    return(1);
                }
                if (x.Date == y.Date)
                {
                    return(0);
                }
                return(-1);
            });

            SetItemsSource(result);
        }
Beispiel #24
0
 public InventorySheets(InventoryDocument parent)
     : base(parent, "sheet")
 {
 }
        public static Document DeserializeRelatedDocument(DocumentRelation relation, XElement relatedDocument)
        {
            Document             parent       = (Document)relation.Parent;
            DocumentRelationType relationType = relation.RelationType;

            Document retDocument = null;

            if (relatedDocument == null)
            {
                throw new ClientException(ClientExceptionId.IncompleteRelation);
            }

            switch (relationType)
            {
            case DocumentRelationType.SalesDocumentToSimulatedInvoice:
            case DocumentRelationType.InvoiceToBill:
                retDocument = new CommercialDocument();
                retDocument.Deserialize(relatedDocument);
                break;

            case DocumentRelationType.ServiceToOutcomeShift:
                if (parent.BOType == BusinessObjectType.ServiceDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new ServiceDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.ServiceToInvoice:
                if (parent.BOType == BusinessObjectType.ServiceDocument)
                {
                    retDocument = new CommercialDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new ServiceDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.ServiceToInternalOutcome:
                if (parent.BOType == BusinessObjectType.ServiceDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new ServiceDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.ComplaintToInternalOutcome:
                if (parent.BOType == BusinessObjectType.ComplaintDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new ComplaintDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.InventoryToWarehouse:
                if (parent.BOType == BusinessObjectType.InventoryDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new InventoryDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.SalesOrderToInvoice:
            case DocumentRelationType.SalesOrderToCorrectiveCommercialDocument:
            case DocumentRelationType.SalesOrderToSimulatedInvoice:
                retDocument = new CommercialDocument();
                retDocument.Deserialize(relatedDocument);
                break;

            case DocumentRelationType.SalesOrderToWarehouseDocument:
                if (parent.BOType == BusinessObjectType.CommercialDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new CommercialDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.SalesOrderToOutcomeFinancialDocument:
                if (parent.BOType == BusinessObjectType.CommercialDocument)
                {
                    retDocument = new FinancialDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new CommercialDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            case DocumentRelationType.ProductionOrderToIncome:
            case DocumentRelationType.ProductionOrderToOutcome:
                if (parent.BOType == BusinessObjectType.CommercialDocument)
                {
                    retDocument = new WarehouseDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                else
                {
                    retDocument = new CommercialDocument();
                    retDocument.Deserialize(relatedDocument);
                }
                break;

            default:
                throw new InvalidOperationException("Unknown DocumentRelationType");
            }

            return(retDocument);
        }
Beispiel #26
0
        /// <summary>
        /// Saves the business object.
        /// </summary>
        /// <param name="document"><see cref="CommercialDocument"/> to save.</param>
        /// <returns>Xml containing result of oper</returns>
        public XDocument SaveBusinessObject(InventoryDocument document)
        {
            DictionaryMapper.Instance.CheckForChanges();

            //load alternate version
            if (!document.IsNew)
            {
                IBusinessObject alternateBusinessObject = this.mapper.LoadBusinessObject(document.BOType, document.Id.Value);
                document.SetAlternateVersion(alternateBusinessObject);
            }

            foreach (var sheet in document.Sheets)
            {
                sheet.SkipLinesSave = true;

                InventorySheet alternateSheet = sheet.AlternateVersion as InventorySheet;

                if (alternateSheet != null && alternateSheet.DocumentStatus != sheet.DocumentStatus && sheet.DocumentStatus == DocumentStatus.Canceled)
                {
                    //jezeli anulowalismy arkusz z poziomu inwentaryzacji to nalezy caly arkusz wczytac, zmienic jego status i dodac do zapisu zeby
                    //wykonala sie tez inna jego logika zwiazana ze zmiana statusu
                    InventorySheet sh = (InventorySheet)this.mapper.LoadBusinessObject(BusinessObjectType.InventorySheet, sheet.Id.Value);
                    sh.DocumentStatus = DocumentStatus.Canceled;
                    document.AddRelatedObject(sh);
                }
            }

            //update status
            document.UpdateStatus(true);

            if (document.AlternateVersion != null)
            {
                document.AlternateVersion.UpdateStatus(false);
            }

            document.Validate();

            this.ExecuteCustomLogic(document);
            this.ExecuteDocumentOptions(document);

            //validate
            document.Validate();

            //update status
            document.UpdateStatus(true);

            if (document.AlternateVersion != null)
            {
                document.AlternateVersion.UpdateStatus(false);
            }

            SqlConnectionManager.Instance.BeginTransaction();

            try
            {
                DictionaryMapper.Instance.CheckForChanges();
                this.mapper.CheckBusinessObjectVersion(document);

                DocumentLogicHelper.AssignNumber(document, this.mapper);

                //Make operations list
                XDocument operations = XDocument.Parse("<root/>");

                document.SaveChanges(operations);

                if (document.AlternateVersion != null)
                {
                    document.AlternateVersion.SaveChanges(operations);
                }

                if (operations.Root.HasElements)
                {
                    this.mapper.ExecuteOperations(operations);
                    if (document.DocumentStatus == DocumentStatus.Committed)
                    {
                        this.mapper.CreateCommunicationXml(document);
                    }
                    this.mapper.UpdateDictionaryIndex(document);
                }

                Coordinator.LogSaveBusinessObjectOperation();

                foreach (var sheet in document.SheetsToSave)
                {
                    using (DocumentCoordinator c = new DocumentCoordinator(false, false))
                    {
                        c.SaveBusinessObject(sheet);
                    }
                }

                if (document.UnblockItems)
                {
                    this.itemMapper.UnblockItems();
                }

                document.SaveRelatedObjects();

                operations = XDocument.Parse("<root/>");

                document.SaveRelations(operations);

                if (document.AlternateVersion != null)
                {
                    ((InventoryDocument)document.AlternateVersion).SaveRelations(operations);
                }

                if (operations.Root.HasElements)
                {
                    this.mapper.ExecuteOperations(operations);
                }


                if (operations.Root.HasElements)
                {
                    this.mapper.CreateCommunicationXmlForDocumentRelations(operations); //generowanie paczek dla relacji dokumentow
                }
                XDocument returnXml = XDocument.Parse(String.Format(CultureInfo.InvariantCulture, "<root><id>{0}</id></root>", document.Id.ToUpperString()));

                //Custom validation
                this.mapper.ExecuteOnCommitValidationCustomProcedure(document);

                if (this.coordinator.CanCommitTransaction)
                {
                    if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                    {
                        SqlConnectionManager.Instance.CommitTransaction();
                    }
                    else
                    {
                        SqlConnectionManager.Instance.RollbackTransaction();
                    }
                }

                return(returnXml);
            }
            catch (SqlException sqle)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:72");
                Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                throw;
            }
            catch (Exception)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:73");
                if (this.coordinator.CanCommitTransaction)
                {
                    SqlConnectionManager.Instance.RollbackTransaction();
                }
                throw;
            }
        }
Beispiel #27
0
        private void ExecuteCustomLogic(InventoryDocument document)
        {
            InventoryDocument alternateDocument = document.AlternateVersion as InventoryDocument;

            if (alternateDocument != null)
            {
                if (alternateDocument.DocumentStatus == DocumentStatus.Saved &&
                    (document.DocumentStatus == DocumentStatus.Committed || document.DocumentStatus == DocumentStatus.Canceled))
                {
                    //wczytujemy wszystkie arkusze
                    foreach (InventorySheet s in document.Sheets)
                    {
                        InventorySheet sheet = (InventorySheet)this.mapper.LoadBusinessObject(BusinessObjectType.InventorySheet, s.Id.Value);

                        if (sheet.DocumentStatus == DocumentStatus.Saved)
                        {
                            sheet.DocumentStatus   = document.DocumentStatus;
                            sheet.SkipItemsUnblock = true;
                            document.SheetsToSave.Add(sheet);
                        }
                    }

                    document.UnblockItems = true;

                    if (document.DocumentStatus == DocumentStatus.Committed)
                    {
                        var whDocs = InventoryDocumentFactory.GenerateDifferentialDocuments(document, document.SheetsToSave);

                        foreach (var whDoc in whDocs)
                        {
                            //Wycena pozycji przychodowych na podstawie ceny ostatniego zakupu
                            //Zrobiłem tak bo nie znam kernela a nie mamy obecnie kernelowca
                            if (whDoc.WarehouseDirection == WarehouseDirection.Income)
                            {
                                XDocument par = new XDocument(new XElement("root",
                                                                           new XElement("warehouseId", whDoc.WarehouseId.ToString()),
                                                                           whDoc.Lines.Serialize()));
                                XDocument priceList      = null;
                                decimal   headerSumation = 0;
                                priceList = new XDocument(this.mapper.ExecuteCustomProcedure("document.p_getWarehouseStock", true, par, true, 120, "xml"));
                                foreach (var item in whDoc.Lines)
                                {
                                    decimal lastPrice;


                                    lastPrice = decimal.Parse(
                                        (from i in priceList.Descendants("line")
                                         where i.Element("itemId").Value.ToLower() == item.ItemId.ToString().ToLower()
                                         select i.Element("lastPurchaseNetPrice").Value).FirstOrDefault().Replace(".", ",")
                                        );

                                    item.Value     = lastPrice * item.Quantity;
                                    item.Price     = lastPrice;
                                    headerSumation = headerSumation + (lastPrice * item.Quantity);
                                }
                                whDoc.Value = headerSumation;
                            }

                            document.AddRelatedObject(whDoc);

                            DocumentRelation relation = document.Relations.CreateNew();
                            relation.RelationType    = DocumentRelationType.InventoryToWarehouse;
                            relation.RelatedDocument = whDoc;

                            relation = whDoc.Relations.CreateNew();
                            relation.RelationType    = DocumentRelationType.InventoryToWarehouse;
                            relation.RelatedDocument = document;
                            relation.DontSave        = true;
                        }
                    }
                }
            }
        }
        public async Task <int> CreateInventoryDocumentAsync(FPReturnInvToPurchasing model, string Type)
        {
            string storageURI = "master/storages";
            string uomURI     = "master/uoms";

            IHttpService httpClient = (IHttpService)this.ServiceProvider.GetService(typeof(IHttpService));

            #region UOM

            Dictionary <string, object> filterUOM = new Dictionary <string, object> {
                { "unit", "MTR" }
            };
            var responseUOM = httpClient.GetAsync($@"{APIEndpoint.Core}{uomURI}?filter=" + JsonConvert.SerializeObject(filterUOM)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultUOM = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseUOM.Result);
            var jsonUOM = resultUOM.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> uom = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonUOM.ToString())[0];

            #endregion UOM

            #region Storage

            var storageName = model.UnitName.Equals("PRINTING") ? "Gudang Greige Printing" : "Gudang Greige Finishing";
            Dictionary <string, object> filterStorage = new Dictionary <string, object> {
                { "name", storageName }
            };
            var responseStorage = httpClient.GetAsync($@"{APIEndpoint.Core}{storageURI}?filter=" + JsonConvert.SerializeObject(filterStorage)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultStorage = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseStorage.Result);
            var jsonStorage = resultStorage.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> storage = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonStorage.ToString())[0];

            #endregion Storage

            #region Inventory Document

            List <InventoryDocumentItem> inventoryDocumentItems = new List <InventoryDocumentItem>();

            foreach (FPReturnInvToPurchasingDetail detail in model.FPReturnInvToPurchasingDetails)
            {
                InventoryDocumentItem inventoryDocumentItem = new InventoryDocumentItem
                {
                    ProductId   = int.Parse(detail.ProductId),
                    ProductCode = detail.ProductCode,
                    ProductName = detail.ProductName,
                    Quantity    = detail.Length,
                    UomId       = int.Parse(uom["Id"].ToString()),
                    UomUnit     = uom["Unit"].ToString()
                };

                inventoryDocumentItems.Add(inventoryDocumentItem);
            }

            InventoryDocument inventoryDocument = new InventoryDocument
            {
                Date          = DateTimeOffset.UtcNow,
                ReferenceNo   = model.No,
                ReferenceType = "Bon Retur Barang - Pembelian",
                Type          = Type,
                StorageId     = int.Parse(storage["_id"].ToString()),
                StorageCode   = storage["code"].ToString(),
                StorageName   = storage["name"].ToString(),
                Items         = inventoryDocumentItems
            };

            var inventoryDocumentFacade = ServiceProvider.GetService <IInventoryDocumentService>();
            return(await inventoryDocumentFacade.Create(inventoryDocument));

            #endregion Inventory Document
        }
Beispiel #29
0
        public async Task <int> CreateInventoryDocument(MaterialDistributionNote model, string type)
        {
            string storageURI = "master/storages";
            string uomURI     = "master/uoms";

            IHttpServiceRepository httpClient = (IHttpServiceRepository)_serviceProvider.GetService(typeof(IHttpServiceRepository));
            /* Get UOM */
            Dictionary <string, object> filterUom = new Dictionary <string, object> {
                { "Unit", "MTR" }
            };
            var responseUom = httpClient.GetAsync($@"{APIEndpoint.Core}{uomURI}?filter=" + JsonConvert.SerializeObject(filterUom)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultUom = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseUom.Result);
            var jsonUom = resultUom.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> Uom = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonUom.ToString())[0];

            /* Get Storage */
            var storageName = model.UnitName.Equals("PRINTING") ? "Warehouse Here Printing" : "Warehouse Here Finishing";
            Dictionary <string, object> filterStorage = new Dictionary <string, object> {
                { "name", storageName }
            };
            var responseStorage = httpClient.GetAsync($@"{APIEndpoint.Core}{storageURI}?filter=" + JsonConvert.SerializeObject(filterStorage)).Result.Content.ReadAsStringAsync();
            Dictionary <string, object> resultStorage = JsonConvert.DeserializeObject <Dictionary <string, object> >(responseStorage.Result);
            var jsonStorage = resultStorage.Single(p => p.Key.Equals("data")).Value;
            Dictionary <string, object> storage = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(jsonStorage.ToString())[0];

            /* Create Inventory Document */
            List <InventoryDocumentItem>          inventoryDocumentItems = new List <InventoryDocumentItem>();
            List <MaterialDistributionNoteDetail> mdnds = new List <MaterialDistributionNoteDetail>();

            foreach (MaterialDistributionNoteItem mdni in model.MaterialDistributionNoteItems)
            {
                mdnds.AddRange(mdni.MaterialDistributionNoteDetails);
            }

            foreach (MaterialDistributionNoteDetail mdnd in mdnds)
            {
                InventoryDocumentItem inventoryDocumentItem = new InventoryDocumentItem
                {
                    ProductId     = int.Parse(mdnd.ProductId),
                    ProductCode   = mdnd.ProductCode,
                    ProductName   = mdnd.ProductName,
                    Quantity      = mdnd.ReceivedLength,
                    StockPlanning = model.Type != "RE-GRADING" ? (mdnd.DistributedLength == 0 ? mdnd.MaterialRequestNoteItemLength - mdnd.ReceivedLength : mdnd.ReceivedLength * -1) : mdnd.ReceivedLength * -1,
                    UomId         = int.Parse(Uom["Id"].ToString()),
                    UomUnit       = Uom["Unit"].ToString()
                };

                inventoryDocumentItems.Add(inventoryDocumentItem);
            }

            List <InventoryDocumentItem> list = inventoryDocumentItems
                                                .GroupBy(m => new { m.ProductId, m.ProductCode, m.ProductName })
                                                .Select(s => new InventoryDocumentItem
            {
                ProductId     = s.First().ProductId,
                ProductCode   = s.First().ProductCode,
                ProductName   = s.First().ProductName,
                Quantity      = s.Sum(d => d.Quantity),
                StockPlanning = s.Sum(d => d.StockPlanning),
                UomUnit       = s.First().UomUnit,
                UomId         = s.First().UomId
            }).ToList();

            InventoryDocument inventoryDocument = new InventoryDocument
            {
                Date          = DateTimeOffset.UtcNow,
                ReferenceNo   = model.No,
                ReferenceType = "Bon introduction to Here",
                Type          = type,
                StorageId     = int.Parse(storage["Id"].ToString()),
                StorageCode   = storage["Code"].ToString(),
                StorageName   = storage["Name"].ToString(),
                Items         = list
            };

            var inventoryDocumentFacade = _serviceProvider.GetService <IInventoryDocumentRepository>();

            return(await inventoryDocumentFacade.Create(inventoryDocument));
        }
        public async Task <int> Create(InventoryDocument model)
        {
            int created             = 0;
            var internalTransaction = _inventoryDbContext.Database.CurrentTransaction == null;
            var transaction         = !internalTransaction ? _inventoryDbContext.Database.CurrentTransaction : _inventoryDbContext.Database.BeginTransaction();

            try
            {
                model.No = GenerateNo(model);
                model.FlagForCreate(_identityInterface.Username, UserAgent);
                model.FlagForUpdate(_identityInterface.Username, UserAgent);

                foreach (var item in model.Items)
                {
                    item.FlagForCreate(_identityInterface.Username, UserAgent);
                    item.FlagForUpdate(_identityInterface.Username, UserAgent);
                }

                _dbSet.Add(model);
                created = await _inventoryDbContext.SaveChangesAsync();

                foreach (var item in model.Items)
                {
                    var qty = item.Quantity;
                    if (model.Type == "OUT")
                    {
                        qty = item.Quantity * -1;
                    }
                    var sumQty = _inventoryDbContext.InventoryMovements.Where(a => a.IsDeleted == false && a.StorageId == model.StorageId && a.ProductId == item.ProductId && a.UomId == item.UomId).Sum(a => a.Quantity);

                    InventoryMovement movementModel = new InventoryMovement
                    {
                        ProductCode   = item.ProductCode,
                        ProductId     = item.ProductId,
                        ProductName   = item.ProductName,
                        StorageCode   = model.StorageCode,
                        StorageId     = model.StorageId,
                        StorageName   = model.StorageName,
                        Before        = sumQty,
                        Quantity      = qty,
                        After         = sumQty + qty,
                        ReferenceNo   = model.ReferenceNo,
                        ReferenceType = model.ReferenceType,
                        Type          = model.Type,
                        Date          = model.Date,
                        UomId         = item.UomId,
                        UomUnit       = item.UomUnit,
                        Remark        = item.ProductRemark
                    };

                    var movement = _serviceProvider.GetService <IInventoryMovementRepository>();
                    await movement.Create(movementModel);
                }
                if (internalTransaction)
                {
                    transaction.Commit();
                }

                return(created);
            }
            catch (Exception e)
            {
                if (internalTransaction)
                {
                    transaction.Rollback();
                }
                throw new Exception(e.Message);
            }
        }