/// <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);
        }
Example #3
0
        /// <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();
            }
        }
Example #4
0
        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;
        }
Example #5
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;
                    }
                }
            }
        }
Example #6
0
        /// <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();
        }
Example #7
0
 /// <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);
 }