Example #1
0
        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);
        }
Example #2
0
        /// <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));
            }
        }
Example #3
0
        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;
                }
            }
        }
Example #4
0
        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);
                }
            }
        }
Example #7
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;
        }
        /// <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;
                }
            }
        }
Example #10
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 #11
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 #12
0
        /// <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);
                    }
                }
            }
        }
Example #13
0
        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);
                    }
                }
            }
        }
Example #14
0
        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);
        }
Example #15
0
        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;
            }
            //
        }