public static void CreateOutcomeShiftFromWarehouseDocument(XElement source, WarehouseDocument destination) { /* * <root> * <warehouseDocumentId>GUID</warehouseDocumentId> * </root> */ DocumentMapper mapper = DependencyContainerManager.Container.Get <DocumentMapper>(); WarehouseDocument incomeDocument = (WarehouseDocument)mapper.LoadBusinessObject(BusinessObjectType.WarehouseDocument, new Guid(source.Element("warehouseDocumentId").Value)); destination.WarehouseId = incomeDocument.WarehouseId; //create lines foreach (var incLine in incomeDocument.Lines) { WarehouseDocumentLine line = destination.Lines.CreateNew(); line.ItemId = incLine.ItemId; line.ItemName = incLine.ItemName; line.Quantity = incLine.Quantity; line.UnitId = incLine.UnitId; line.ItemTypeId = incLine.ItemTypeId; } //Duplicate attributes DuplicableAttributeFactory.DuplicateAttributes(incomeDocument, destination); }
/// <summary> /// Creates the related business object from XML element. /// </summary> /// <param name="element">Xml element from which to create the <see cref="IBusinessObject"/>.</param> /// <param name="relatedObjectType">Type of the related object.</param> /// <returns>Related object.</returns> public static IBusinessObject CreateRelatedBusinessObjectFromXmlElement(XElement element, BusinessObjectType relatedObjectType) { if (relatedObjectType == BusinessObjectType.CommercialDocumentLine) { CommercialDocumentLine line = new CommercialDocumentLine(null); line.Deserialize(element); return(line); } else if (relatedObjectType == BusinessObjectType.WarehouseDocumentLine) { WarehouseDocumentLine line = new WarehouseDocumentLine(null); line.Deserialize(element); return(line); } else if (relatedObjectType == BusinessObjectType.Payment) { Payment pt = new Payment(null); pt.Deserialize(element); return(pt); } else { Mapper m = Mapper.GetMapperForSpecifiedBusinessObjectType(relatedObjectType); return(m.ConvertToBusinessObject(element, null)); } }
private void ProcessTechnology(CommercialDocument technology, decimal quantity, WarehouseDocument income, WarehouseDocument outcome, WarehouseDocument byproductIncome, int ordinalNumber) { List <Guid> outcomeLinesId = new List <Guid>(); foreach (var line in technology.Lines) { string lineType = line.Attributes[DocumentFieldName.LineAttribute_ProductionItemType].Value.Value; //material/product/byproduct WarehouseDocumentLine whLine = null; //Tutaj należy zadać pytanie co zrobić dla labor if (lineType == "material") { whLine = outcome.Lines.CreateNew(); whLine.GenerateId(); outcomeLinesId.Add(whLine.Id.Value); } else if (lineType == "byproduct") { whLine = byproductIncome.Lines.CreateNew(); } else if (lineType == "labor") { line.Quantity = line.Quantity; } else// if (lineType == "product") { whLine = income.Lines.CreateNew(); whLine.ValuateFromOutcomeDocumentLinesId = outcomeLinesId; income.ValuateFromOutcomeDocumentId = outcome.Id.Value; if (quantity % line.Quantity != 0) { throw new ClientException(ClientExceptionId.ProductionOrderQuantityError, null, "ordinalNumber:" + ordinalNumber.ToString(CultureInfo.InvariantCulture), "quantity:" + line.Quantity.ToString(CultureInfo.InvariantCulture)); } } if (lineType != "labor") { whLine.ItemId = line.ItemId; whLine.ItemName = line.ItemName; whLine.UnitId = line.UnitId; whLine.Quantity += quantity * line.Quantity; } } }
private static void AddShiftPosition(ServiceDocument serviceDocument, Guid sourceWarehouseId, Guid destinationWarehouseId, List <WarehouseDocument> shiftDocumentsList, Guid itemId, decimal quantity, Guid unitId) { WarehouseDocument shift = (from doc in shiftDocumentsList where doc.WarehouseId == sourceWarehouseId && doc.Attributes.Children.Where(a => a.DocumentFieldName == DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId) .First().Value.Value.ToUpperInvariant() == destinationWarehouseId.ToUpperString() select doc).FirstOrDefault(); if (shift == null) //tworzymy takiego szifta { using (DocumentCoordinator c = new DocumentCoordinator(false, false)) { string processType = serviceDocument.Attributes[DocumentFieldName.Attribute_ProcessType].Value.Value; string template = ProcessManager.Instance.GetDocumentTemplate(serviceDocument, "outcomeShift"); shift = (WarehouseDocument)c.CreateNewBusinessObject(BusinessObjectType.WarehouseDocument, template, null); ProcessManager.Instance.AppendProcessAttributes(shift, processType, "outcomeShift", serviceDocument.Id, DocumentRelationType.ServiceToOutcomeShift); DuplicableAttributeFactory.DuplicateAttributes(serviceDocument, shift); serviceDocument.AddRelatedObject(shift); shiftDocumentsList.Add(shift); shift.WarehouseId = sourceWarehouseId; var dstWarehouseId = shift.Attributes[DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId]; if (dstWarehouseId == null) { dstWarehouseId = shift.Attributes.CreateNew(); dstWarehouseId.DocumentFieldName = DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId; } dstWarehouseId.Value.Value = destinationWarehouseId.ToUpperString(); } } //sprawdzamy czy moze juz jest pozycja na ten sam towar. jak jest to edytujemy quantity, jak nie to tworzymy nowa WarehouseDocumentLine line = shift.Lines.Children.Where(l => l.ItemId == itemId).FirstOrDefault(); if (line == null) { line = shift.Lines.CreateNew(); line.ItemId = itemId; line.UnitId = unitId; } line.Quantity += quantity; }
/// <summary> /// Recursively creates new children (BusinessObjects) and loads settings from provided xml. /// </summary> /// <param name="element">Xml element to attach.</param> public override void Deserialize(XElement element) { base.Deserialize(element); this.RelatedLine = null; if (element.Element("relatedLine") != null && this.Parent.Parent != null) { if (this.Parent.Parent.BOType == BusinessObjectType.CommercialDocument) { WarehouseDocumentLine line = new WarehouseDocumentLine(null); line.Deserialize(element.Element("relatedLine").Element("line")); this.RelatedLine = line; } else { CommercialDocumentLine line = new CommercialDocumentLine(null); line.Deserialize(element.Element("relatedLine").Element("line")); this.RelatedLine = line; } } }
/// <summary> /// Validations the document during transaction. /// </summary> /// <param name="document">The document to validate.</param> private void ValidationDuringTransaction(WarehouseDocument document) { if (!document.IsNew) { if (this.mapper.HasIncomeWarehouseDocumentAnyOutcomeRelation(document.Id.Value)) { //sprawdzamy czy jakies linie byly dodane nowe a jak byly to czy zmiana byla od wartosci zero do wiekszej od zera foreach (WarehouseDocumentLine line in document.Lines.Children) { if (line.Status == BusinessObjectStatus.Modified) { WarehouseDocumentLine alternateLine = (WarehouseDocumentLine)line.AlternateVersion; if (alternateLine.Value != 0 || alternateLine.ItemId != line.ItemId || alternateLine.Quantity != line.Quantity || alternateLine.Direction != line.Direction) { throw new ClientException(ClientExceptionId.UnableToEditIncomeWarehouseDocument); } } } if ((document.Lines.IsAnyChildNew() || document.Lines.IsAnyChildDeleted())) { throw new ClientException(ClientExceptionId.UnableToEditIncomeWarehouseDocument); } } ICollection <Guid> allCorrections = mapper.GetWarehouseCorrectiveDocumentsId(document.Id.Value); if (allCorrections != null && allCorrections.Count != 0) { throw new ClientException(ClientExceptionId.UnableToEditDocumentBecauseOfCorrections); } } }
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; }
/// <summary> /// Creates the outcomes for the specifies lines using specified deliveries. /// </summary> /// <param name="lines">The lines for which to create the outcomes. They have to be from the same warehouse.</param> /// <param name="deliveryResponses">Collection of delivery responses. Can contain deliveries from other warehouses too.</param> public void CreateOutcomes(ICollection <WarehouseDocumentLine> lines, ICollection <DeliveryResponse> deliveryResponses) { foreach (WarehouseDocumentLine line in lines) { WarehouseDocument warehouseDocument = line.Parent as WarehouseDocument; var deliveryResponse = (from del in deliveryResponses where del.ItemId == line.ItemId && del.WarehouseId == line.WarehouseId select del).FirstOrDefault(); var validDeliveries = deliveryResponse.Deliveries.Where(d => this.IsValidDelivery(d.IssueDate, warehouseDocument.IssueDate)); decimal originalAvailableQuantity = deliveryResponse.AvailableQuantity; //tutaj zliczam wszystkie nowe na wypadek edycji bo wtedy powinny zostac wszystkie relacje usuniete i na nowo utworzone decimal lineDeliveriesSelected = line.IncomeOutcomeRelations.Children.Where(rr => rr.IsNew).Sum(r => r.Quantity); if (lineDeliveriesSelected != Math.Abs(line.Quantity)) { if (warehouseDocument.IsBeforeSystemStartOutcomeCorrection) { throw new ClientException(ClientExceptionId.NotEnoughQuantityContainerSlot); } else { throw new ClientException(ClientExceptionId.NotEnoughDeliveriesSelected, null, "itemName:" + line.ItemName ?? line.ItemId.ToString()); } } foreach (IncomeOutcomeRelation relation in line.IncomeOutcomeRelations.Children.Where(c => c.IsNew)) { //odszukujemy dostawe var del = validDeliveries.Where(d => d.IncomeWarehouseDocumentLineId == relation.RelatedLine.Id.Value).FirstOrDefault(); if (del == null || del.Quantity == 0 || del.Quantity < relation.Quantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } //ustawiamy income date na relacji relation.IncomeDate = del.IncomeDate; relation.Status = BusinessObjectStatus.New; line.IncomeDate = del.IncomeDate; deliveryResponse.AvailableQuantity -= relation.Quantity; del.Quantity -= relation.Quantity; } //dla wz-tow realizujacych rezerwacje pomijamy ilosci zarezerwowane. bierzemy pod uwage tylko ilosc na stanie i koniec if ((!line.CommercialWarehouseRelations.Children.Any(r => r.IsOrderRelation) || warehouseDocument.SkipReservedQuantityCheck) && deliveryResponse.AvailableQuantity < 0) { WarehouseDocumentLine altLine = line.AlternateVersion as WarehouseDocumentLine; /* * tutaj ten if jest w celu obsluzenia takiego przypadku: * Mamy na magazynie 0 sztuk, a zarezerwowane 2 * Edytujemy dokument, ktory ma 3 szt. wiec zwalniamy powiazania i tworzymy je na nowo * W tej sytuacji bez tego if'a wyskoczy nam ze mozemy tylko 1 szt. zabrac, a mozemy w praktyce wziasc * wszystkie 3 bo te 3 zostaly przez naz zwolnione */ if (altLine == null || altLine.Quantity - originalAvailableQuantity < deliveryResponse.AvailableQuantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } } } }
public void CreateLinesForOutcomeShiftDocument(ICollection <WarehouseDocumentLine> sourceLines, ICollection <DeliveryResponse> deliveryResponses, WarehouseDocument destinationDocument) { foreach (WarehouseDocumentLine line in sourceLines) { WarehouseDocument warehouseDocument = line.Parent as WarehouseDocument; var deliveryResponse = (from del in deliveryResponses where del.ItemId == line.ItemId && del.WarehouseId == line.WarehouseId select del).FirstOrDefault(); var validDeliveries = deliveryResponse.Deliveries.Where(d => this.IsValidDelivery(d.IssueDate, warehouseDocument.IssueDate)); decimal originalAvailableQuantity = deliveryResponse.AvailableQuantity; //tutaj zliczam wszystkie nowe na wypadek edycji bo wtedy powinny zostac wszystkie relacje usuniete i na nowo utworzone decimal lineDeliveriesSelected = line.IncomeOutcomeRelations.Children.Where(rr => rr.IsNew).Sum(r => r.Quantity); if (lineDeliveriesSelected != line.Quantity) { throw new ClientException(ClientExceptionId.NotEnoughDeliveriesSelected, null, "itemName:" + line.ItemName); } foreach (IncomeOutcomeRelation relation in line.IncomeOutcomeRelations.Children.Where(c => c.IsNew)) { //odszukujemy dostawe var del = validDeliveries.Where(d => d.IncomeWarehouseDocumentLineId == relation.RelatedLine.Id.Value).FirstOrDefault(); if (del == null || del.Quantity == 0 || del.Quantity < relation.Quantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } WarehouseDocumentLine dstLine = destinationDocument.Lines.CreateNew(); dstLine.SourceOutcomeShiftLine = line; //ustawiamy income date na relacji dstLine.ItemId = line.ItemId; dstLine.OutcomeDate = destinationDocument.IssueDate; dstLine.Price = line.Price; dstLine.Quantity = relation.Quantity; dstLine.UnitId = line.UnitId; dstLine.WarehouseId = destinationDocument.WarehouseId; dstLine.IncomeDate = del.IncomeDate; IncomeOutcomeRelation rel = dstLine.IncomeOutcomeRelations.CreateNew(BusinessObjectStatus.New, WarehouseDirection.Outcome); if (relation.Quantity == del.Quantity) { rel.OutcomeDate = dstLine.OutcomeDate; } rel.IncomeDate = del.IncomeDate; rel.Quantity = relation.Quantity; rel.RelatedLine.Id = del.IncomeWarehouseDocumentLineId; deliveryResponse.AvailableQuantity -= relation.Quantity; del.Quantity -= relation.Quantity; } //dla wz-tow realizujacych rezerwacje pomijamy ilosci zarezerwowane. bierzemy pod uwage tylko ilosc na stanie i koniec if (!line.CommercialWarehouseRelations.Children.Any(r => r.IsOrderRelation) && deliveryResponse.AvailableQuantity < 0) { WarehouseDocumentLine altLine = line.AlternateVersion as WarehouseDocumentLine; /* * tutaj ten if jest w celu obsluzenia takiego przypadku: * Mamy na magazynie 0 sztuk, a zarezerwowane 2 * Edytujemy dokument, ktory ma 3 szt. wiec zwalniamy powiazania i tworzymy je na nowo * W tej sytuacji bez tego if'a wyskoczy nam ze mozemy tylko 1 szt. zabrac, a mozemy w praktyce wziasc * wszystkie 3 bo te 3 zostaly przez naz zwolnione */ if (altLine == null || altLine.Quantity - originalAvailableQuantity < deliveryResponse.AvailableQuantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } } } //przepinamy shifty do nowo podzielonych linii if (destinationDocument.ShiftTransaction != null) { foreach (Shift shift in destinationDocument.ShiftTransaction.Shifts.Children) { var foundLine = destinationDocument.Lines.Children.Where(l => l.IncomeOutcomeRelations.Children.First().RelatedLine.Id.Value == shift.IncomeWarehouseDocumentLineId && shift.LineOrdinalNumber.Value == l.SourceOutcomeShiftLine.OrdinalNumber).FirstOrDefault(); shift.RelatedWarehouseDocumentLine = foundLine; } } }
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> /// Creates the outcomes for the specifies lines using specified deliveries. /// </summary> /// <param name="lines">The lines for which to create the outcomes. They have to be from the same warehouse.</param> /// <param name="deliveryResponses">Collection of delivery responses. Can contain deliveries from other warehouses too.</param> public void CreateOutcomes(ICollection <WarehouseDocumentLine> lines, ICollection <DeliveryResponse> deliveryResponses) { foreach (WarehouseDocumentLine line in lines) { WarehouseDocument warehouseDocument = line.Parent as WarehouseDocument; var deliveryResponse = (from del in deliveryResponses where del.ItemId == line.ItemId && del.WarehouseId == line.WarehouseId select del).FirstOrDefault(); var sortedDeliveries = from del in deliveryResponse.Deliveries where IsValidDelivery(del.IssueDate, warehouseDocument.IssueDate) == true orderby del.IncomeDate ascending, del.OrdinalNumber ascending select del; decimal originalAvailableQuantity = deliveryResponse.AvailableQuantity; decimal quantityToGo = Math.Abs(line.Quantity); while (quantityToGo > 0) { if (sortedDeliveries.Count() == 0) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } else { DeliveryResponse.SingleDelivery del = sortedDeliveries.First(); if (del.Quantity >= quantityToGo) { IncomeOutcomeRelation rel = line.IncomeOutcomeRelations.CreateNew(BusinessObjectStatus.New, WarehouseDirection.Outcome); rel.Quantity = quantityToGo; rel.RelatedLine.Id = del.IncomeWarehouseDocumentLineId; rel.IncomeDate = del.IncomeDate; line.IncomeDate = rel.IncomeDate; del.Quantity -= quantityToGo; deliveryResponse.AvailableQuantity -= quantityToGo; quantityToGo = 0; if (del.Quantity == 0) { rel.OutcomeDate = line.OutcomeDate; deliveryResponse.Deliveries.Remove(del); } } else //del.Quantity < quantityToGo { IncomeOutcomeRelation rel = line.IncomeOutcomeRelations.CreateNew(BusinessObjectStatus.New, WarehouseDirection.Outcome); rel.OutcomeDate = line.OutcomeDate; rel.IncomeDate = del.IncomeDate; line.IncomeDate = rel.IncomeDate; rel.Quantity = del.Quantity; deliveryResponse.AvailableQuantity -= del.Quantity;; rel.RelatedLine.Id = del.IncomeWarehouseDocumentLineId; quantityToGo -= del.Quantity; deliveryResponse.Deliveries.Remove(del); } } } //dla wz-tow realizujacych rezerwacje pomijamy ilosci zarezerwowane. bierzemy pod uwage tylko ilosc na stanie i koniec if ((!line.CommercialWarehouseRelations.Children.Any(r => r.IsOrderRelation) || warehouseDocument.SkipReservedQuantityCheck) && deliveryResponse.AvailableQuantity < 0) { WarehouseDocumentLine altLine = line.AlternateVersion as WarehouseDocumentLine; /* * tutaj ten if jest w celu obsluzenia takiego przypadku: * Mamy na magazynie 0 sztuk, a zarezerwowane 2 * Edytujemy dokument, ktory ma 3 szt. wiec zwalniamy powiazania i tworzymy je na nowo * W tej sytuacji bez tego if'a wyskoczy nam ze mozemy tylko 1 szt. zabrac, a mozemy w praktyce wziasc * wszystkie 3 bo te 3 zostaly przez naz zwolnione */ if (altLine == null || altLine.Quantity - originalAvailableQuantity < deliveryResponse.AvailableQuantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } } } }
public void CreateLinesForOutcomeShiftDocument(ICollection <WarehouseDocumentLine> sourceLines, ICollection <DeliveryResponse> deliveryResponses, WarehouseDocument destinationDocument) { foreach (WarehouseDocumentLine line in sourceLines) { var deliveryResponse = (from del in deliveryResponses where del.ItemId == line.ItemId && del.WarehouseId == line.WarehouseId select del).FirstOrDefault(); var sortedDeliveries = from del in deliveryResponse.Deliveries where IsValidDelivery(del.IssueDate, destinationDocument.IssueDate) == true orderby del.IncomeDate ascending select del; decimal originalAvailableQuantity = deliveryResponse.AvailableQuantity; decimal quantityToGo = line.Quantity; while (quantityToGo > 0) { if (sortedDeliveries.Count() == 0) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } else { DeliveryResponse.SingleDelivery del = sortedDeliveries.First(); if (del.Quantity >= quantityToGo) { //tworzymy linie na dokumencie docelowym WarehouseDocumentLine dstLine = destinationDocument.Lines.CreateNew(); dstLine.ItemId = line.ItemId; dstLine.OutcomeDate = destinationDocument.IssueDate; dstLine.Price = line.Price; dstLine.Quantity = quantityToGo; dstLine.UnitId = line.UnitId; dstLine.WarehouseId = destinationDocument.WarehouseId; IncomeOutcomeRelation rel = dstLine.IncomeOutcomeRelations.CreateNew(BusinessObjectStatus.New, WarehouseDirection.Outcome); rel.Quantity = quantityToGo; rel.RelatedLine.Id = del.IncomeWarehouseDocumentLineId; rel.IncomeDate = del.IncomeDate; dstLine.IncomeDate = rel.IncomeDate; del.Quantity -= quantityToGo; deliveryResponse.AvailableQuantity -= quantityToGo; quantityToGo = 0; if (del.Quantity == 0) { rel.OutcomeDate = line.OutcomeDate; deliveryResponse.Deliveries.Remove(del); } } else //del.Quantity < quantityToGo { //tworzymy linie na dokumencie docelowym WarehouseDocumentLine dstLine = destinationDocument.Lines.CreateNew(); dstLine.ItemId = line.ItemId; dstLine.OutcomeDate = destinationDocument.IssueDate; dstLine.Price = line.Price; dstLine.Quantity = del.Quantity; dstLine.UnitId = line.UnitId; dstLine.WarehouseId = destinationDocument.WarehouseId; IncomeOutcomeRelation rel = dstLine.IncomeOutcomeRelations.CreateNew(BusinessObjectStatus.New, WarehouseDirection.Outcome); rel.OutcomeDate = dstLine.OutcomeDate; rel.IncomeDate = del.IncomeDate; dstLine.IncomeDate = rel.IncomeDate; rel.Quantity = del.Quantity; deliveryResponse.AvailableQuantity -= del.Quantity; rel.RelatedLine.Id = del.IncomeWarehouseDocumentLineId; quantityToGo -= del.Quantity; deliveryResponse.Deliveries.Remove(del); } } } //W sytuacji gdy MM- realizuje zamówienie, opcja, która nada odpowiednie powiązanie jest wykonywana po tej metodzie. Dlatego sprawdzane jest tu czy taka opcja jest xml zawarta a potem relacja zostanie dodana if ((!destinationDocument.DoesRealizeOrder || destinationDocument.SkipReservedQuantityCheck) && deliveryResponse.AvailableQuantity < 0) { WarehouseDocumentLine altLine = line.AlternateVersion as WarehouseDocumentLine; if (altLine == null || altLine.Quantity - originalAvailableQuantity < deliveryResponse.AvailableQuantity) { string itemName = DependencyContainerManager.Container.Get <ItemMapper>().GetItemName(line.ItemId); throw new ClientException(ClientExceptionId.NoItemInStock, null, "itemName:" + itemName, "warehouseName:" + this.warehouseName); } } } }
public static ICollection <WarehouseDocument> GenerateDifferentialDocuments(InventoryDocument document, ICollection <InventorySheet> sheets) { string incomeTemplate = document.DocumentType.InventoryDocumentOptions.IncomeDifferentialDocumentTemplate; string outcomeTemplate = document.DocumentType.InventoryDocumentOptions.OutcomeDifferentialDocumentTemplate; WarehouseItemQuantityInventoryDocumentDictionary dict = new WarehouseItemQuantityInventoryDocumentDictionary(); foreach (InventorySheet sheet in sheets) { if (sheet.WarehouseId == null) { throw new ClientException(ClientExceptionId.NoWarehouseIdOnInventorySheet, null, "ordinalNumber:" + sheet.OrdinalNumber.ToString(CultureInfo.InvariantCulture)); } foreach (InventorySheetLine line in sheet.Lines) { if (line.Direction == 0) { continue; } if (line.UserQuantity == null) { throw new ClientException(ClientExceptionId.NoUserQuantityOnInventorySheetLine, null, "lineOrdinalNumber:" + line.OrdinalNumber.ToString(CultureInfo.InvariantCulture), "sheetOrdinalNumber:" + sheet.OrdinalNumber.ToString(CultureInfo.InvariantCulture)); } dict.Add(sheet.WarehouseId.Value, line.ItemId, line.UserQuantity.Value, line.SystemQuantity, line.UnitId); } } //majac juz wszystkie towary i ilosci posumowane sprawdzamy w ktorym przypadku userQuantity != systemQuantity i generujemy odpowiedni dokumencik List <WarehouseDocument> incomeDocuments = new List <WarehouseDocument>(); List <WarehouseDocument> outcomeDocuments = new List <WarehouseDocument>(); foreach (Guid warehouseId in dict.Dictionary.Keys) { var innerDict = dict.Dictionary[warehouseId]; foreach (Guid itemId in innerDict.Keys) { var qty = innerDict[itemId]; if (qty.Quantity != qty.SystemQuantity) { WarehouseDocument doc = null; if (qty.Quantity > qty.SystemQuantity) { doc = InventoryDocumentFactory.GetDocumentFromList(warehouseId, incomeTemplate, incomeDocuments); } else { doc = InventoryDocumentFactory.GetDocumentFromList(warehouseId, outcomeTemplate, outcomeDocuments); } WarehouseDocumentLine line = doc.Lines.CreateNew(); line.ItemId = itemId; line.Quantity = Math.Abs(qty.Quantity - qty.SystemQuantity); line.UnitId = qty.UnitId; } } } foreach (WarehouseDocument wDoc in outcomeDocuments) { if (DictionaryMapper.Instance.GetWarehouse(wDoc.WarehouseId).ValuationMethod == ValuationMethod.DeliverySelection) { CommercialWarehouseDocumentFactory.GenerateRelationsAndShiftsForOutcomeWarehouseDocument(wDoc); } } List <WarehouseDocument> retList = new List <WarehouseDocument>(); foreach (var doc in incomeDocuments) { retList.Add(doc); } foreach (var doc in outcomeDocuments) { retList.Add(doc); } return(retList); }
public static void CreateIncomeShiftDocumentFromOutcomeShift(XElement source, WarehouseDocument destination) { //TODO: tutaj powinno byc odczytywanie z MM- jaki jest typ dokumentu lustrzanego destination.DocumentTypeId = DictionaryMapper.Instance.GetDocumentType("MM+").Id.Value; if (source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("contractorId") != null) { ContractorMapper contractorMapper = DependencyContainerManager.Container.Get <ContractorMapper>(); Contractor contractor = (Contractor)contractorMapper.CreateNewBusinessObject(BusinessObjectType.Contractor, null); contractor.Id = new Guid(source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("contractorId").Value); destination.Contractor = contractor; } destination.Number.FullNumber = source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("fullNumber").Value; destination.Number.Number = Convert.ToInt32(source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("number").Value, CultureInfo.InvariantCulture); destination.Number.SeriesId = new Guid(source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("seriesId").Value); destination.Value = Convert.ToDecimal(source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("value").Value, CultureInfo.InvariantCulture); destination.DocumentStatus = DocumentStatus.Saved; //set warehouse as destination wh in the source Guid whDocumentFieldId = DictionaryMapper.Instance.GetDocumentField(DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId).Id.Value; string warehouseId = (from node in source.Element("root").Element("documentAttrValue").Elements() where node.Element("documentFieldId").Value == whDocumentFieldId.ToUpperString() select node).ElementAt(0).Element("textValue").Value; destination.WarehouseId = new Guid(warehouseId); //create attributes DocumentAttrValue attr = null; var attrs = destination.Attributes.Children.Where(a => a.DocumentFieldName == DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId); if (attrs.Count() == 1) { attr = attrs.ElementAt(0); } else { attr = destination.Attributes.CreateNew(); attr.DocumentFieldName = DocumentFieldName.ShiftDocumentAttribute_OppositeWarehouseId; } attr.Value.Value = source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("warehouseId").Value; attr = destination.Attributes.CreateNew(); attr.DocumentFieldName = DocumentFieldName.ShiftDocumentAttribute_OppositeDocumentStatus; attr.Value.Value = source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("status").Value; attr = destination.Attributes.CreateNew(); attr.DocumentFieldName = DocumentFieldName.ShiftDocumentAttribute_OppositeDocumentId; attr.Value.Value = source.Element("root").Element("warehouseDocumentHeader").Element("entry").Element("id").Value; DocumentField df = DictionaryMapper.Instance.GetDocumentField(DocumentFieldName.Attribute_IncomeShiftOrderId); if (df != null) { var srcAttr = source.Element("root").Element("documentAttrValue").Elements("entry").Where(e => e.Element("documentFieldId").Value == df.Id.ToUpperString()).FirstOrDefault(); if (srcAttr != null) { attr = destination.Attributes.CreateNew(); attr.DocumentFieldName = DocumentFieldName.Attribute_IncomeShiftOrderId; attr.Value.Value = srcAttr.Element("textValue").Value; } } // bool isLocalShift = destination.IsLocalShift(); if (isLocalShift) { destination.DocumentStatus = DocumentStatus.Committed; } //create lines foreach (XElement entry in source.Element("root").Element("warehouseDocumentLine").Elements().OrderBy(e => Convert.ToInt32(e.Element("ordinalNumber").Value, CultureInfo.InvariantCulture))) { WarehouseDocumentLine line = destination.Lines.CreateNew(); if (!isLocalShift) { line.Direction = 0; } line.ItemId = new Guid(entry.Element("itemId").Value); line.IncomeDate = DateTime.Parse(entry.Element("outcomeDate").Value, CultureInfo.InvariantCulture); line.Quantity = Convert.ToDecimal(entry.Element("quantity").Value, CultureInfo.InvariantCulture); line.Price = Convert.ToDecimal(entry.Element("price").Value, CultureInfo.InvariantCulture); line.Value = Convert.ToDecimal(entry.Element("value").Value, CultureInfo.InvariantCulture); line.UnitId = new Guid(entry.Element("unitId").Value); line.WarehouseId = destination.WarehouseId; } // }