/// <summary> /// Creates new <see cref="WarehouseDocumentLine"/> according to the WarehouseDocument's defaults and attaches it to the parent <see cref="WarehouseDocument"/>. /// </summary> /// <returns>A new <see cref="WarehouseDocumentLine"/>.</returns> public override WarehouseDocumentLine CreateNew() { WarehouseDocument parent = (WarehouseDocument)this.Parent; //create new object and attach it to the element WarehouseDocumentLine line = new WarehouseDocumentLine(parent); WarehouseDirection parentDirection = parent.DocumentType.WarehouseDocumentOptions.WarehouseDirection; if (!parent.IsBeforeSystemStart) { if (parentDirection == WarehouseDirection.Outcome || parentDirection == WarehouseDirection.OutcomeShift) { line.Direction = -1; } else { line.Direction = 1; } } if (parentDirection == WarehouseDirection.OutcomeShift || parentDirection == WarehouseDirection.IncomeShift) { line.IsDistributed = true; } line.Order = this.Children.Count + 1; //add object to the collection this.Children.Add(line); return(line); }
/// <summary> /// Creates new <see cref="IncomeOutcomeRelation"/> and attaches it to the parent <see cref="WarehouseDocumentLine"/>. /// </summary> /// <param name="status">The status that has to be set to the newly created <see cref="BusinessObject"/>.</param> /// <param name="direction">The relation's direction.</param> /// <returns>A new <see cref="IncomeOutcomeRelation"/>.</returns> public IncomeOutcomeRelation CreateNew(BusinessObjectStatus status, WarehouseDirection direction) { IncomeOutcomeRelation relation = this.CreateNew(status); relation.Direction = direction; return(relation); }
/// <summary> /// Validates the <see cref="BusinessObject"/>. /// </summary> public override void Validate() { base.Validate(); RelatedLinesChangePolicy relatedLinesChangePolicy = RelatedLinesChangePolicy.Unknown; WarehouseDocument warehouseParent = ((WarehouseDocument)this.Parent); if (warehouseParent != null) { relatedLinesChangePolicy = warehouseParent.DocumentType.WarehouseDocumentOptions.RelatedLinesChangePolicy; } bool skipQuantityValidation = ((WarehouseDocument)this.Parent).SkipQuantityValidation; if (!skipQuantityValidation && relatedLinesChangePolicy != RelatedLinesChangePolicy.ValueOnly) { if (this.Quantity <= 0) { throw new ClientException(ClientExceptionId.QuantityBelowOrEqualZero, null, "itemName:" + this.ItemName); } decimal quantityOnOrderRelation = this.CommercialWarehouseRelations.Children.Where(r => r.IsOrderRelation).Sum(rr => rr.Quantity); if (quantityOnOrderRelation > this.Quantity) { throw new ClientException(ClientExceptionId.UnableToEditOutcomeWarehouseDocument3); } } WarehouseDirection direction = ((WarehouseDocument)this.Parent).WarehouseDirection; if (relatedLinesChangePolicy != RelatedLinesChangePolicy.ValueOnly && direction == WarehouseDirection.Income && this.Price < 0) { throw new ClientException(ClientExceptionId.LinePriceBelowOrEqualZero); } if (this.IncomeOutcomeRelations != null) { this.IncomeOutcomeRelations.Validate(); } if (this.CommercialWarehouseValuations != null) { this.CommercialWarehouseValuations.Validate(); } if (this.CommercialWarehouseRelations != null) { this.CommercialWarehouseRelations.Validate(); } if (this.Attributes != null) { this.Attributes.Validate(); } }
public static void CreateCorrectiveDocument(XElement source, WarehouseDocument destination) { Guid sourceDocumentId = new Guid(source.Element("correctedDocumentId").Value); DocumentMapper mapper = DependencyContainerManager.Container.Get <DocumentMapper>(); WarehouseDocument sourceDocument = (WarehouseDocument)mapper.LoadBusinessObject(BusinessObjectType.WarehouseDocument, sourceDocumentId); WarehouseDirection direction = sourceDocument.WarehouseDirection; if (ConfigurationMapper.Instance.PreventDocumentCorrectionBeforeSystemStart && sourceDocument.IsBeforeSystemStart) { throw new ClientException(ClientExceptionId.DocumentCorrectionBeforeSystemStartError); } destination.Contractor = sourceDocument.Contractor; destination.WarehouseId = sourceDocument.WarehouseId; DuplicableAttributeFactory.DuplicateAttributes(sourceDocument, destination); foreach (WarehouseDocumentLine line in sourceDocument.Lines.Children) { WarehouseDocumentLine correctedLine = mapper.GetWarehouseDocumentLineAfterCorrection(line, direction); if (correctedLine != null) { destination.Lines.AppendChild(correctedLine); } } if (destination.Lines.Children.Count == 0) { throw new ClientException(ClientExceptionId.FullyCorrectedCorrectionError); } destination.InitialCorrectedDocument = sourceDocument; }
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; } } } }
/// <summary> /// Builds request based on <see cref="WarehouseDocument"/> /// </summary> /// <param name="warehouseDocument"></param> internal UpdateStockRequest(WarehouseDocument warehouseDocument) { List <RequestItem> requests = new List <RequestItem>(); //TODO: sprawdzic czy nie trzeba zmienic znaku na przeciwny w tych miejscach bo nei pamietam czy to jest wartosc //roznicowa wzgledem magazynu czy wzgledem direction jakie te pozycje maja foreach (WarehouseDocumentLine line in warehouseDocument.Lines.Children) { RequestItem req = requests.Where(x => x.ItemId == line.ItemId && x.WarehouseId == line.WarehouseId).FirstOrDefault(); if (line.Status == BusinessObjectStatus.New) { if (req == null) { requests.Add(new RequestItem(line.ItemId, line.WarehouseId, line.UnitId, line.Direction * line.Quantity)); } else { req.DifferentialQuantity += line.Direction * line.Quantity; } } else if (line.Status == BusinessObjectStatus.Modified) { WarehouseDocumentLine alternateLine = (WarehouseDocumentLine)line.AlternateVersion; if (req == null) { requests.Add(new RequestItem(line.ItemId, line.WarehouseId, line.UnitId, line.Direction * line.Quantity - (alternateLine.Direction * alternateLine.Quantity))); } else { req.DifferentialQuantity += line.Direction * line.Quantity - (alternateLine.Direction * alternateLine.Quantity); } } else if (line.Status == BusinessObjectStatus.Unchanged) { if (req == null) { requests.Add(new RequestItem(line.ItemId, line.WarehouseId, line.UnitId, 0)); } } } if (warehouseDocument.AlternateVersion != null) { WarehouseDocument alternate = (WarehouseDocument)warehouseDocument.AlternateVersion; var deletedLines = alternate.Lines.Children.Where(l => l.Status == BusinessObjectStatus.Deleted); foreach (WarehouseDocumentLine deletedLine in deletedLines) { RequestItem request = requests.Where(r => r.ItemId == deletedLine.ItemId && r.WarehouseId == deletedLine.WarehouseId).FirstOrDefault(); WarehouseDirection direction = warehouseDocument.WarehouseDirection; if (request == null) { if (direction == WarehouseDirection.Income || direction == WarehouseDirection.IncomeShift) { requests.Add(new RequestItem(deletedLine.ItemId, deletedLine.WarehouseId, deletedLine.UnitId, -deletedLine.Quantity)); } else if (direction == WarehouseDirection.Outcome || direction == WarehouseDirection.OutcomeShift) { requests.Add(new RequestItem(deletedLine.ItemId, deletedLine.WarehouseId, deletedLine.UnitId, deletedLine.Quantity)); } } else { if (direction == WarehouseDirection.Income || direction == WarehouseDirection.IncomeShift) { request.DifferentialQuantity -= deletedLine.Quantity; } else if (direction == WarehouseDirection.Outcome || direction == WarehouseDirection.OutcomeShift) { request.DifferentialQuantity += deletedLine.Quantity; } } } } this.requestItems = requests.ToArray(); }
/// <summary> /// Initializes a new instance of the <see cref="IncomeOutcomeRelation"/> class with a specified xml root element. /// </summary> /// <param name="parent">Parent <see cref="WarehouseDocumentLine"/>.</param> /// <param name="direction">The direction of the relation. Specifies whether this relation puts something to warehouse or gets something from warehouse.</param> public IncomeOutcomeRelation(BusinessObject parent, WarehouseDirection direction) : base(parent, BusinessObjectType.IncomeOutcomeRelation) { this.Direction = direction; this.RelatedLine = new WarehouseDocumentLine(null); }