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; } }
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; } } } }
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); }
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); }
/// <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; } }
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 }; } }
private void ExecuteCustomLogic(ComplaintDocument document) { this.RealizeDecisions(document); }
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; } } }