Beispiel #1
0
        public void Execute(Document document)
        {
            if (document.IsBeforeSystemStart)
            {
                return;
            }

            DocumentAttrValue attr = document.Attributes[DocumentFieldName.Attribute_ProcessState];

            if (attr != null)
            {
                ComplaintDocument complaintDocument = (ComplaintDocument)document;

                foreach (var line in complaintDocument.Lines)
                {
                    decimal decisionQuantity = line.ComplaintDecisions.Children.Sum(d => d.Quantity);

                    if (line.Quantity != decisionQuantity)
                    {
                        throw new ClientException(ClientExceptionId.ComplaintDocumentCloseError);
                    }

                    if (line.ComplaintDecisions.Children.Where(dd => dd.RealizeOption != RealizationStage.Realized).FirstOrDefault() != null)
                    {
                        throw new ClientException(ClientExceptionId.ComplaintDocumentCloseError);
                    }
                }

                attr.Value.Value = "closed";
                complaintDocument.DocumentStatus = DocumentStatus.Committed;
            }
        }
Beispiel #2
0
        private void SetIssuingPerson(ComplaintDocument document)
        {
            Guid userId = SessionManager.User.UserId;

            foreach (var line in document.Lines.Children)
            {
                if (line.IsNew)
                {
                    line.IssuingPersonContractorId = userId;
                }

                foreach (var decision in line.ComplaintDecisions.Children)
                {
                    if (decision.IsNew)
                    {
                        decision.IssuingPersonContractorId = userId;
                    }
                }
            }
        }
Beispiel #3
0
        private void RealizeDecisions(ComplaintDocument document)
        {
            var decisionsToRealize = from line in document.Lines.Children
                                     from decision in line.ComplaintDecisions.Children
                                     where decision.IsMarkedForRealization()
                                     select decision;

            this.CheckForNecessaryShifts(document, decisionsToRealize);

            List <WarehouseDocument> generatedWhDocs   = new List <WarehouseDocument>();
            List <ComplaintDecision> realizedDecisions = new List <ComplaintDecision>();

            foreach (var decision in decisionsToRealize)
            {
                if (decision.DecisionType == DecisionType.Disposal)
                {
                    this.AddPositionToWarehouseDocument(document, decision.WarehouseId.Value, generatedWhDocs, decision.ReplacementItemId,
                                                        decision.Quantity, decision.ReplacementUnitId, WarehouseDirection.Outcome);
                }
                else if (decision.DecisionType == DecisionType.ReturnToSupplier)
                {
                    this.AddPositionToWarehouseDocument(document, decision.WarehouseId.Value, generatedWhDocs, decision.ReplacementItemId,
                                                        decision.Quantity, decision.ReplacementUnitId, WarehouseDirection.Outcome);

                    ComplaintDocumentLine line = (ComplaintDocumentLine)decision.Parent;

                    this.AddPositionToWarehouseDocument(document, ProcessManager.Instance.GetComplaintWarehouse(document), generatedWhDocs, line.ItemId,
                                                        decision.Quantity, line.UnitId, WarehouseDirection.Income);
                }

                realizedDecisions.Add(decision);
            }

            foreach (var decision in realizedDecisions)
            {
                decision.RealizeOption = RealizationStage.Realized;
            }

            this.ValuateInternalIncomes(generatedWhDocs);
        }
Beispiel #4
0
 public Guid GetComplaintWarehouse(ComplaintDocument document)
 {
     return(this.GetGuidProcessConciguration(document, "complaintWarehouseId"));
 }
        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 #6
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(ComplaintDocument document)
        {
            DictionaryMapper.Instance.CheckForChanges();

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

            this.SetIssuingPerson(document);

            //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);
                    this.mapper.CreateCommunicationXml(document);
                    this.mapper.UpdateDictionaryIndex(document);
                }

                Coordinator.LogSaveBusinessObjectOperation();

                document.SaveRelatedObjects();

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

                document.SaveRelations(operations);

                if (document.AlternateVersion != null)
                {
                    ((ComplaintDocument)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:53");
                Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                throw;
            }
            catch (Exception)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:54");
                if (this.coordinator.CanCommitTransaction)
                {
                    SqlConnectionManager.Instance.RollbackTransaction();
                }
                throw;
            }
        }
Beispiel #7
0
        private void CheckForNecessaryShifts(ComplaintDocument document, IEnumerable <ComplaintDecision> decisions)
        {
            //List<Allocation> necessaryShifts = new List<Allocation>();
            AllocationCollection necessaryAllocations = new AllocationCollection();

            foreach (var decision in decisions)
            {
                Warehouse wh = DictionaryMapper.Instance.GetWarehouse(decision.WarehouseId.Value);

                if (wh.ValuationMethod == ValuationMethod.DeliverySelection)
                {
                    var allocation = necessaryAllocations.Allocations.Where(s => s.ItemId == decision.ReplacementItemId && s.WarehouseId == decision.WarehouseId.Value).FirstOrDefault();

                    //jezeli mamy juz taki shift potrzebny to tylko zwiekszamy ilosc, jesli nie to tworzymy go nowego
                    if (allocation == null)
                    {
                        allocation = new Allocation()
                        {
                            ItemId = decision.ReplacementItemId, WarehouseId = decision.WarehouseId.Value
                        };
                        necessaryAllocations.Allocations.Add(allocation);
                    }

                    allocation.FirstAllocation().Quantity += decision.Quantity;
                }
            }

            bool throwException = false;

            /* sprawdzamy czy na dokumencie wybrano dostawy
             * jezeli wybrano jakies to sprawdzamy czy w wystarczajacych ilosciach
             * jezeli nie wybrano to uzupelniamy je domyslnymi dostawami i rzucamy
             * w postaci wyjatku do panelu
             */

            if (document.AllocationCollection != null) //sprawdzamy czy ilosci starczy
            {
                foreach (var necessaryAllocation in necessaryAllocations.Allocations)
                {
                    var clientAllocation = document.AllocationCollection.Allocations.Where(s => s.ItemId == necessaryAllocation.ItemId && s.WarehouseId == necessaryAllocation.WarehouseId).FirstOrDefault();

                    if (clientAllocation == null || //jezeli w ogole nie wybral alokacji dla tej pary item/warehouse
                        clientAllocation.AllocationShifts.Sum(i => i.Quantity) < necessaryAllocation.FirstAllocation().Quantity || //jezeli wybral za malo
                        clientAllocation.AllocationShifts.Where(x => x.IncomeWarehouseDocumentLineId == Guid.Empty).FirstOrDefault() != null)    //jezeli nie wskazal z jakiej linii pz pochodzi
                    {
                        throwException = true;
                        break;
                    }
                }
            }
            else if (necessaryAllocations.Allocations.Count > 0)
            {
                throwException = true;
            }

            if (throwException)
            {
                //teraz uzupelniamy domyslne transze i kopiujemy je do nowej kolekcji (bo starej nie mozemy zmieniac jak bedziemy iterowac po niej)
                AllocationCollection allocations = new AllocationCollection();
                WarehouseMapper      whMapper    = DependencyContainerManager.Container.Get <WarehouseMapper>();

                foreach (var allocation in necessaryAllocations.Allocations)
                {
                    XElement xml    = whMapper.GetAvailableLots(allocation.ItemId, allocation.WarehouseId);
                    XElement ptrLot = (XElement)xml.FirstNode;

                    //w tej petli nie zmieniamy wartosci co sa w xmlu xml bo i tak
                    //kazdy towar jest przerwazany tylko raz (w postaci zagregowanej)
                    while (allocation.FirstAllocation().Quantity > 0 && ptrLot != null)
                    {
                        var newAllocation = allocations.Get(allocation.ItemId, allocation.WarehouseId);

                        newAllocation.ItemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(newAllocation.ItemId);

                        var newAllocationItem = new AllocationShift();
                        newAllocation.AllocationShifts.Add(newAllocationItem);

                        if (ptrLot.Attribute("shiftId") != null)
                        {
                            newAllocationItem.SourceShiftId = new Guid(ptrLot.Attribute("shiftId").Value);
                        }

                        newAllocationItem.IncomeWarehouseDocumentLineId = new Guid(ptrLot.Attribute("incomeWarehouseDocumentLineId").Value);

                        if (ptrLot.Attribute("containerLabel") != null)
                        {
                            newAllocationItem.ContainerLabel = ptrLot.Attribute("containerLabel").Value;
                        }

                        if (ptrLot.Attribute("slotContainerLabel") != null)
                        {
                            newAllocationItem.SlotContainerLabel = ptrLot.Attribute("slotContainerLabel").Value;
                        }

                        decimal lotQuantity = Convert.ToDecimal(ptrLot.Attribute("quantity").Value, CultureInfo.InvariantCulture);

                        if (lotQuantity >= allocation.FirstAllocation().Quantity) //jest wiecej niz potrzebujemy
                        {
                            newAllocationItem.Quantity = allocation.FirstAllocation().Quantity;
                            allocation.FirstAllocation().Quantity = 0;
                        }
                        else
                        {
                            newAllocationItem.Quantity = lotQuantity;
                            allocation.FirstAllocation().Quantity -= lotQuantity;
                        }

                        ptrLot = (XElement)ptrLot.NextNode;
                    }

                    if (allocation.FirstAllocation().Quantity != 0)
                    {
                        string itemName      = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(allocation.ItemId);
                        string warehouseName = DictionaryMapper.Instance.GetWarehouse(allocation.WarehouseId).Symbol;
                        throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + warehouseName);
                    }
                }

                XElement xmlData = allocations.Serialize();
                throw new ClientException(ClientExceptionId.SelectLots)
                      {
                          XmlData = xmlData
                      };
            }
        }
Beispiel #8
0
 private void ExecuteCustomLogic(ComplaintDocument document)
 {
     this.RealizeDecisions(document);
 }
Beispiel #9
0
        private void AddPositionToWarehouseDocument(ComplaintDocument complaintDocument, Guid warehouseId, List <WarehouseDocument> generatedWhDocs, Guid itemId, decimal quantity, Guid unitId, WarehouseDirection direction)
        {
            WarehouseDocument document = (from whDoc in generatedWhDocs
                                          where whDoc.WarehouseId == warehouseId &&
                                          whDoc.WarehouseDirection == direction
                                          select whDoc).FirstOrDefault();

            if (document == null)
            {
                string documentName = null;

                if (direction == WarehouseDirection.Outcome)
                {
                    documentName = "internalOutcome";
                }
                else
                {
                    documentName = "internalIncome";
                }

                string template = ProcessManager.Instance.GetDocumentTemplate(complaintDocument, documentName);

                using (DocumentCoordinator c = new DocumentCoordinator(false, false))
                {
                    document             = (WarehouseDocument)c.CreateNewBusinessObject(BusinessObjectType.WarehouseDocument, template, null);
                    document.WarehouseId = warehouseId;
                    string processType = complaintDocument.Attributes[DocumentFieldName.Attribute_ProcessType].Value.Value;
                    ProcessManager.Instance.AppendProcessAttributes(document, processType, documentName, null, null);
                    document.Contractor = complaintDocument.Contractor;
                    DuplicableAttributeFactory.DuplicateAttributes(complaintDocument, document);
                    complaintDocument.AddRelatedObject(document);
                    generatedWhDocs.Add(document);

                    var relation = complaintDocument.Relations.CreateNew();
                    relation.RelationType    = DocumentRelationType.ComplaintToInternalOutcome;
                    relation.RelatedDocument = document;

                    relation = document.Relations.CreateNew();
                    relation.RelationType    = DocumentRelationType.ComplaintToInternalOutcome;
                    relation.RelatedDocument = complaintDocument;
                    relation.DontSave        = true;
                }
            }

            WarehouseDocumentLine line = document.Lines.Children.Where(l => l.ItemId == itemId).FirstOrDefault();

            if (line == null)
            {
                line        = document.Lines.CreateNew();
                line.ItemId = itemId;
                line.UnitId = unitId;
            }

            line.Quantity += quantity;

            /* sprawdzamy czy jest to rozchod z magazynu wmsowego. jezeli tak to tworzymy shift transaction
             * dodajemy nowego shifta zgodnie z tym co jest w complaintDocument.Shifts, potem
             * shifta wiazemy z pozycja
             */

            if (DictionaryMapper.Instance.GetWarehouse(document.WarehouseId).ValuationMethod == ValuationMethod.DeliverySelection)
            {
                ShiftTransaction shiftTransaction = document.ShiftTransaction;

                if (shiftTransaction == null)
                {
                    shiftTransaction          = new ShiftTransaction(null);
                    document.ShiftTransaction = shiftTransaction;
                }

                //wyciagamy shifty z complaintDocumenta
                var shifts = complaintDocument.AllocationCollection.Allocations.Where(s => s.ItemId == itemId && s.WarehouseId == warehouseId).Select(x => x.AllocationShifts).FirstOrDefault();

                decimal quantityToGo = quantity; //kopiujemy shifty na ilosc niewieksza niz na pozycji jest wybrane

                foreach (var shift in shifts)
                {
                    if (shift.Quantity == 0)
                    {
                        continue;
                    }

                    decimal quantityTaken = 0;

                    if (quantityToGo > shift.Quantity)
                    {
                        quantityTaken = shift.Quantity;
                    }
                    else //quantityToGo <= shift.Quantity
                    {
                        quantityTaken = quantityToGo;
                    }

                    shift.Quantity -= quantityTaken;
                    quantityToGo   -= quantityTaken;

                    if (shift.SourceShiftId != null) //te ktore nie maja sourceShiftId pomijamy bo tutaj takie luzem w ogole nie maja shifta
                    {
                        var newShift = shiftTransaction.Shifts.CreateNew();
                        newShift.ItemId        = itemId;
                        newShift.WarehouseId   = warehouseId;
                        newShift.SourceShiftId = shift.SourceShiftId.Value;
                        newShift.IncomeWarehouseDocumentLineId = shift.IncomeWarehouseDocumentLineId;
                        newShift.Quantity = quantityTaken;
                        newShift.RelatedWarehouseDocumentLine = line;
                        newShift.LineOrdinalNumber            = line.OrdinalNumber;
                    }

                    //teraz incomeOutcomeRelation dodajemy
                    IncomeOutcomeRelation relation = line.IncomeOutcomeRelations.Children.Where(i => i.RelatedLine.Id.Value == shift.IncomeWarehouseDocumentLineId).FirstOrDefault();

                    if (relation == null)
                    {
                        relation = line.IncomeOutcomeRelations.CreateNew();

                        var incLine = new WarehouseDocumentLine(null);
                        incLine.Id           = shift.IncomeWarehouseDocumentLineId;
                        relation.RelatedLine = incLine;
                    }

                    relation.Quantity += quantityTaken;

                    if (quantityToGo == 0)
                    {
                        break;
                    }
                }
            }
        }
        public void ChangeDocumentStatus(Document document, DocumentStatus requestedStatus)
        {
            WarehouseDocument  warehouseDocument  = document as WarehouseDocument;
            FinancialDocument  financialDocument  = document as FinancialDocument;
            ServiceDocument    serviceDocument    = document as ServiceDocument;
            InventoryDocument  inventoryDocument  = document as InventoryDocument;
            ComplaintDocument  complaintDocument  = document as ComplaintDocument;
            CommercialDocument commercialDocument = document as CommercialDocument;

            DocumentStatus actualStatus = document.DocumentStatus;
            Guid           documentId   = document.Id.Value;

            bool useStandardCancelProcessing = false;

            #region MM+
            if (warehouseDocument != null && warehouseDocument.WarehouseDirection == WarehouseDirection.IncomeShift)             //MM+
            {
                if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Committed)
                {
                    warehouseDocument.DocumentStatus = DocumentStatus.Committed;
                    warehouseDocument.IssueDate      = SessionManager.VolatileElements.CurrentDateTime;

                    foreach (WarehouseDocumentLine line in warehouseDocument.Lines.Children)
                    {
                        line.Direction  = 1;
                        line.IncomeDate = SessionManager.VolatileElements.CurrentDateTime;
                    }

                    this.coordinator.SaveBusinessObject(warehouseDocument);
                }
                else if ((actualStatus == DocumentStatus.Committed || actualStatus == DocumentStatus.Saved) && requestedStatus == DocumentStatus.Canceled)
                {
                    useStandardCancelProcessing = true;
                }
            }
            #endregion
            #region MM-
            else if (warehouseDocument != null && warehouseDocument.WarehouseDirection == WarehouseDirection.OutcomeShift)             //MM-
            {
                if (actualStatus == DocumentStatus.Committed && requestedStatus == DocumentStatus.Canceled)
                {
                    useStandardCancelProcessing = true;

                    foreach (var line in warehouseDocument.Lines)
                    {
                        line.IncomeOutcomeRelations.RemoveAll();
                    }
                }
            }
            #endregion
            #region FinancialDocument
            else if (financialDocument != null)
            {
                if (actualStatus == DocumentStatus.Committed && requestedStatus == DocumentStatus.Canceled)
                {
                    DocumentStatusChangeLogic.CancelFinancialDocument(financialDocument);

                    this.coordinator.SaveBusinessObject(financialDocument);
                }
            }
            #endregion
            #region WarehouseDocumentCorrection
            else if (warehouseDocument != null && (warehouseDocument.DocumentType.DocumentCategory == DocumentCategory.IncomeWarehouseCorrection ||
                                                   warehouseDocument.DocumentType.DocumentCategory == DocumentCategory.OutcomeWarehouseCorrection))
            {
                SqlConnectionManager.Instance.BeginTransaction();

                try
                {
                    if (ConfigurationMapper.Instance.IsWmsEnabled)
                    {
                        DependencyContainerManager.Container.Get <WarehouseMapper>().DeleteShiftsForDocument(warehouseDocument.Id.Value);
                    }

                    this.mapper.CancelWarehouseDocument(warehouseDocument.Id.Value);
                    Coordinator.LogSaveBusinessObjectOperation();

                    if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                    {
                        SqlConnectionManager.Instance.CommitTransaction();
                    }
                    else
                    {
                        SqlConnectionManager.Instance.RollbackTransaction();
                    }
                }
                catch (SqlException sqle)
                {
                    RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:59");
                    Coordinator.ProcessSqlException(sqle, document.BOType, true);
                    throw;
                }
                catch (Exception)
                {
                    RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:60");
                    SqlConnectionManager.Instance.RollbackTransaction();
                    throw;
                }
            }
            #endregion
            #region ServiceDocument
            else if (serviceDocument != null)
            {
                if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Canceled)
                {
                    using (DocumentCoordinator c = new DocumentCoordinator(false, true))
                    {
                        c.CancelServiceDocument(serviceDocument);
                    }
                }
            }
            #endregion
            #region InventoryDocument
            else if (inventoryDocument != null)
            {
                if (actualStatus == DocumentStatus.Saved && (requestedStatus == DocumentStatus.Committed || requestedStatus == DocumentStatus.Canceled))
                {
                    inventoryDocument.DocumentStatus = requestedStatus;

                    using (DocumentCoordinator c = new DocumentCoordinator(false, true))
                    {
                        c.SaveBusinessObject(inventoryDocument);
                    }
                }
            }
            #endregion
            #region ComplaintDocument
            else if (complaintDocument != null)
            {
                if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Canceled)
                {
                    SqlConnectionManager.Instance.BeginTransaction();
                    this.coordinator.CanCommitTransaction = false;

                    foreach (DocumentRelation relation in complaintDocument.Relations)
                    {
                        if (relation.RelationType == DocumentRelationType.ComplaintToInternalIncome ||
                            relation.RelationType == DocumentRelationType.ComplaintToInternalOutcome)
                        {
                            using (DocumentCoordinator c = new DocumentCoordinator(false, false))
                            {
                                XDocument xml = new XDocument(new XElement("root"));
                                xml.Root.Add(new XElement("warehouseDocumentId", relation.RelatedDocument.Id.ToUpperString()));
                                xml.Root.Add(new XElement("status", "-20"));
                                c.ChangeDocumentStatus(xml);
                            }
                        }
                    }

                    complaintDocument.DocumentStatus = DocumentStatus.Canceled;
                    complaintDocument.Attributes[DocumentFieldName.Attribute_ProcessState].Value.Value = "closed";

                    try
                    {
                        this.coordinator.SaveBusinessObject(complaintDocument);

                        if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                        {
                            SqlConnectionManager.Instance.CommitTransaction();
                        }
                        else
                        {
                            SqlConnectionManager.Instance.RollbackTransaction();
                        }
                    }
                    catch (SqlException sqle)
                    {
                        RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:61");
                        Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                        throw;
                    }
                    catch (Exception)
                    {
                        RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:62");
                        SqlConnectionManager.Instance.RollbackTransaction();
                        throw;
                    }
                }
                else if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Committed)
                {
                    if (complaintDocument.DocumentOptions.Where(o => o is CloseProcessOption).FirstOrDefault() == null)
                    {
                        complaintDocument.DocumentOptions.Add(new CloseProcessOption());
                    }

                    this.coordinator.SaveBusinessObject(complaintDocument);
                }
            }
            #endregion
            #region SalesOrder
            else if (commercialDocument != null && commercialDocument.DocumentType.DocumentCategory == DocumentCategory.SalesOrder)
            {
                if (actualStatus == DocumentStatus.Committed && requestedStatus == DocumentStatus.Saved)                 //anulowanie rozliczenia
                {
                    SalesOrderFactory.OpenSalesOrder(commercialDocument);
                    commercialDocument.Attributes.Remove(commercialDocument.Attributes[DocumentFieldName.Attribute_SettlementDate]);
                    commercialDocument.DocumentStatus = DocumentStatus.Saved;
                }
                else if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Canceled)
                {
                    commercialDocument.Attributes[DocumentFieldName.Attribute_ProcessState].Value.Value = "canceled";
                    commercialDocument.DocumentStatus = DocumentStatus.Canceled;

                    foreach (CommercialDocumentLine line in commercialDocument.Lines.Children)
                    {
                        line.CommercialDirection = 0;
                        line.OrderDirection      = 0;
                        line.CommercialWarehouseRelations.RemoveAll();
                    }
                }
                else if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Committed)
                {
                    bool result = SalesOrderFactory.TryCloseSalesOrder(commercialDocument);

                    if (!result)
                    {
                        throw new ClientException(ClientExceptionId.ErrorClosingSalesOrder);
                    }
                }

                this.coordinator.SaveBusinessObject(document);
            }
            #endregion
            #region ProductionOrder
            else if (commercialDocument != null && commercialDocument.DocumentType.DocumentCategory == DocumentCategory.ProductionOrder)
            {
                if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Committed)
                {
                    commercialDocument.Attributes[DocumentFieldName.Attribute_ProcessState].Value.Value = "closed";
                    commercialDocument.DocumentStatus = DocumentStatus.Committed;
                }
                else if (actualStatus == DocumentStatus.Saved && requestedStatus == DocumentStatus.Canceled)
                {
                    commercialDocument.Attributes[DocumentFieldName.Attribute_ProcessState].Value.Value = "canceled";
                    commercialDocument.DocumentStatus = DocumentStatus.Canceled;
                }

                this.coordinator.SaveBusinessObject(document);
            }
            #endregion
            else if (actualStatus == DocumentStatus.Committed && requestedStatus == DocumentStatus.Canceled)
            {
                useStandardCancelProcessing = true;
            }

            //standardowa część anulowania dokumentu
            if (useStandardCancelProcessing)
            {
                SqlConnectionManager.Instance.BeginTransaction();
                this.coordinator.CanCommitTransaction = false;

                document.DocumentStatus = DocumentStatus.Canceled;

                if (document.BOType == BusinessObjectType.CommercialDocument)
                {
                    commercialDocument.ValidateSalesOrderRealizedLines(false);                    //muszę najpierw sprawdzić są pow. z ZS bo potem usuwam atrybut
                    this.ResetCommercialDocumentLinesFlags(commercialDocument);
                }
                else
                {
                    warehouseDocument.CheckDoesRealizeClosedSalesOrder(coordinator);                    //sprawdzenie przed usunięciem relacji
                    this.ResetWarehouseDocumentLinesFlags(warehouseDocument);
                }
                document.Relations.RemoveAll();

                try
                {
                    this.coordinator.SaveBusinessObject(document);

                    if (document.BOType == BusinessObjectType.CommercialDocument)
                    {
                        this.mapper.UnrelateCommercialDocumentFromWarehouseDocuments(documentId);
                    }
                    else
                    {
                        this.mapper.DeleteWarehouseDocumentRelations((WarehouseDocument)document);
                    }

                    if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                    {
                        SqlConnectionManager.Instance.CommitTransaction();
                    }
                    else
                    {
                        SqlConnectionManager.Instance.RollbackTransaction();
                    }
                }
                catch (SqlException sqle)
                {
                    RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:63");
                    Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                    throw;
                }
                catch (Exception)
                {
                    RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:64");
                    SqlConnectionManager.Instance.RollbackTransaction();
                    throw;
                }
            }
        }