/// <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(InventorySheet sheet)
        {
            DictionaryMapper.Instance.CheckForChanges();

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

            //update status
            sheet.UpdateStatus(true);

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

            //validate
            sheet.Validate();

            if (sheet.DocumentStatus == DocumentStatus.Canceled)
            {
                foreach (var line in sheet.Lines) //jak anulujemy arkusz to zerujemy direction na pozycjach
                {
                    line.Direction = 0;
                }
            }

            //update status
            sheet.UpdateStatus(true);

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

            SqlConnectionManager.Instance.BeginTransaction();

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

                this.ProcessInventoryHeaderOperations(sheet);

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

                sheet.SaveChanges(operations);

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

                if (operations.Root.HasElements)
                {
                    this.mapper.ExecuteOperations(operations);
                    //this.mapper.CreateCommunicationXml(sheet);
                    //this.mapper.UpdateDictionaryIndex(sheet);
                }

                if (!sheet.SkipItemsUnblock &&                                                                                                                         //jezeli nie mamy pominac odblokowywania bo np. dokument inwentaryzacji to zrobi za nas
                    sheet.Lines.Children.Where(l => l.Direction == 0 && (l.IsNew || ((InventorySheetLine)l.AlternateVersion).Direction > 0)).FirstOrDefault() != null) //jezeli jakas linia zostala anulowana
                {
                    itemMapper.UnblockItems();
                }

                Coordinator.LogSaveBusinessObjectOperation();

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

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

                XDocument returnXml = XDocument.Parse(String.Format(CultureInfo.InvariantCulture, "<root><id>{0}</id></root>", sheet.Id.ToUpperString()));

                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:76");
                Coordinator.ProcessSqlException(sqle, sheet.BOType, this.coordinator.CanCommitTransaction);
                throw;
            }
            catch (Exception)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:77");
                if (this.coordinator.CanCommitTransaction)
                {
                    SqlConnectionManager.Instance.RollbackTransaction();
                }
                throw;
            }
        }