Esempio n. 1
0
        public override XDocument SaveBusinessObject(WarehouseDocument document)
        {
            DictionaryMapper.Instance.CheckForChanges();

            this.DeliverySelectionCheck(document);

            //validate
            document.Validate();

            //load alternate version
            if (!document.IsNew)
            {
                IBusinessObject alternateBusinessObject = this.mapper.LoadBusinessObject(document.BOType, document.Id.Value);
                document.SetAlternateVersion(alternateBusinessObject);
            }

            this.ProcessShiftOrder(document);

            //update status
            document.UpdateStatus(true);

            if (document.AlternateVersion != null)
            {
                document.AlternateVersion.UpdateStatus(false);
            }

            SqlConnectionManager.Instance.BeginTransaction();

            try
            {
                DictionaryMapper.Instance.CheckForChanges();
                this.mapper.CheckBusinessObjectVersion(document);

                if (document.DocumentStatus == DocumentStatus.Canceled && ConfigurationMapper.Instance.IsWmsEnabled)
                {
                    DependencyContainerManager.Container.Get <WarehouseMapper>().DeleteShiftsForDocument(document.Id.Value);
                }

                if (document.DocumentType.WarehouseDocumentOptions.UpdateLastPurchasePrice)
                {
                    UpdateLastPurchasePriceRequest updateLastPurchasePriceRequest = new UpdateLastPurchasePriceRequest(document);
                    this.mapper.UpdateStock(updateLastPurchasePriceRequest);
                }

                //Make operations list
                XDocument operations = XDocument.Parse("<root/>");

                document.SaveChanges(operations);

                if (document.AlternateVersion != null)
                {
                    document.AlternateVersion.SaveChanges(operations);
                }

                if (operations.Root.HasElements)
                {
                    this.coordinator.UpdateStock(document);
                    //this.mapper.UpdateStockForCanceledDocument(document);

                    this.mapper.ExecuteOperations(operations);

                    this.mapper.CreateCommunicationXml(document);
                    this.mapper.CreateCommunicationXmlForDocumentRelations(operations);
                    this.mapper.UpdateDictionaryIndex(document);
                }

                Coordinator.LogSaveBusinessObjectOperation();

                document.SaveRelatedObjects();

                operations = XDocument.Parse("<root/>");

                document.SaveRelations(operations);

                if (document.AlternateVersion != null)
                {
                    ((WarehouseDocument)document.AlternateVersion).SaveRelations(operations);
                }

                if (operations.Root.HasElements)
                {
                    this.mapper.ExecuteOperations(operations);
                    this.mapper.CreateCommunicationXmlForDocumentRelations(operations); //generowanie paczek dla relacji dokumentow
                }

                this.mapper.ValuateIncomeWarehouseDocument(document, false);

                this.ProcessLocalIncomeShift(document);

                XDocument returnXml = XDocument.Parse(String.Format(CultureInfo.InvariantCulture, "<root><id>{0}</id></root>", document.Id.ToUpperString()));

                //Custom validation
                this.mapper.ExecuteOnCommitValidationCustomProcedure(document);

                if (this.coordinator.CanCommitTransaction)
                {
                    if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                    {
                        SqlConnectionManager.Instance.CommitTransaction();
                    }
                    else
                    {
                        SqlConnectionManager.Instance.RollbackTransaction();
                    }
                }

                return(returnXml);
            }
            catch (SqlException sqle)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:69");
                Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                throw;
            }
            catch (Exception)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:70");
                if (this.coordinator.CanCommitTransaction)
                {
                    SqlConnectionManager.Instance.RollbackTransaction();
                }
                throw;
            }
        }
        public XDocument ProcessWarehouseCorrectiveDocument(WarehouseDocument document)
        {
            SqlConnectionManager.Instance.BeginTransaction();

            try
            {
                DictionaryMapper.Instance.CheckForChanges();

                this.MakeDifferentialDocument(document);

                if (document.DocumentType.WarehouseDocumentOptions.UpdateLastPurchasePrice)
                {
                    UpdateLastPurchasePriceRequest updateLastPurchasePriceRequest = new UpdateLastPurchasePriceRequest(document);
                    this.mapper.UpdateStock(updateLastPurchasePriceRequest);
                }

                //sprawdzamy czy nie zmniejszylismy gdzies ilosci ponizej ilosci ktora zostala juz rozchodowana
                bool outcomeCorrectionNeeded = this.CheckForQuantityBelowRelated(document);

                document.AlternateVersion = null;
                this.coordinator.UpdateStock(document);

                WarehouseDocument incomeCorrection = (WarehouseDocument)this.coordinator.CreateNewBusinessObject(BusinessObjectType.WarehouseDocument, document.Source.Attribute("template").Value, null);
                incomeCorrection.Contractor  = document.Contractor;
                incomeCorrection.WarehouseId = document.WarehouseId;
                DuplicableAttributeFactory.CopyAttributes(document, incomeCorrection);
                incomeCorrection.UpdateStatus(true);
                this.SaveDocumentHeaderAndAttributes(incomeCorrection);

                WarehouseDocument outcomeCorrection = null;
                int? outcomeCorrectionOrdinalNumber = null;
                Guid?outcomeCorrectionHeaderId      = null;

                if (outcomeCorrectionNeeded)
                {
                    DocumentType dt       = incomeCorrection.DocumentType;
                    string       template = dt.WarehouseDocumentOptions.AutomaticCostCorrectionTemplate;

                    if (String.IsNullOrEmpty(template))
                    {
                        throw new InvalidOperationException("automaticCostCorrectionTemplate is not set for the document type: " + dt.Symbol);
                    }

                    outcomeCorrection             = (WarehouseDocument)this.coordinator.CreateNewBusinessObject(BusinessObjectType.WarehouseDocument, template, null);
                    outcomeCorrection.WarehouseId = document.WarehouseId;
                    outcomeCorrection.UpdateStatus(true);
                    this.SaveDocumentHeaderAndAttributes(outcomeCorrection);
                    outcomeCorrectionOrdinalNumber = 0;
                    outcomeCorrectionHeaderId      = outcomeCorrection.Id.Value;
                }

                int       incomeCorrectionOrdinalNumber = 0;
                XDocument xml        = null;
                XDocument operations = XDocument.Parse("<root><incomeOutcomeRelation/><commercialWarehouseRelation/><commercialWarehouseValuation/></root>");

                foreach (WarehouseDocumentLine line in document.Lines.Children)
                {
                    Guid?commercialCorrectiveLineId = null;

                    if (line.CommercialCorrectiveLine != null)
                    {
                        commercialCorrectiveLineId = line.CommercialCorrectiveLine.Id;
                    }

                    xml = this.mapper.CreateIncomeQuantityCorrection(line.Id.Value, line.Version.Value, incomeCorrection.Id.Value,
                                                                     outcomeCorrectionHeaderId, line.Quantity, line.Value, line.IncomeDate.Value, incomeCorrectionOrdinalNumber,
                                                                     outcomeCorrectionOrdinalNumber, commercialCorrectiveLineId);

                    //Prowizorka umieszczona w celu wychwycenia trudnego do zlokalizowania błędu - przerzucam komunikat od Czarka w wyjątku
                    if (!xml.Root.HasElements)
                    {
                        throw new ClientException(ClientExceptionId.ForwardError, null
                                                  , String.Format("message:{0}", xml.Root.Value));
                    }

                    incomeCorrectionOrdinalNumber = Convert.ToInt32(xml.Root.Element("incomeOrdinalNumber").Value, CultureInfo.InvariantCulture);

                    if (outcomeCorrectionOrdinalNumber != null)
                    {
                        outcomeCorrectionOrdinalNumber = Convert.ToInt32(xml.Root.Element("outcomeOrdinalNumber").Value, CultureInfo.InvariantCulture);
                    }

                    if (xml.Root.Element("incomeOutcomeRelation") != null)
                    {
                        operations.Root.Element("incomeOutcomeRelation").Add(xml.Root.Element("incomeOutcomeRelation").Elements());
                    }

                    if (xml.Root.Element("commercialWarehouseRelation") != null)
                    {
                        operations.Root.Element("commercialWarehouseRelation").Add(xml.Root.Element("commercialWarehouseRelation").Elements());
                    }

                    if (xml.Root.Element("commercialWarehouseValuation") != null)
                    {
                        operations.Root.Element("commercialWarehouseValuation").Add(xml.Root.Element("commercialWarehouseValuation").Elements());
                    }
                }

                if (ConfigurationMapper.Instance.IsWmsEnabled &&
                    DictionaryMapper.Instance.GetWarehouse(incomeCorrection.WarehouseId).ValuationMethod == ValuationMethod.DeliverySelection)
                {
                    using (WarehouseCoordinator whC = new WarehouseCoordinator(false, false))
                    {
                        ShiftTransaction st = (ShiftTransaction)whC.CreateNewBusinessObject(BusinessObjectType.ShiftTransaction, null, null);
                        st.UpdateStatus(true);
                        XDocument shiftTransactionOperations = XDocument.Parse("<root/>");
                        st.SaveChanges(shiftTransactionOperations);
                        this.mapper.ExecuteOperations(shiftTransactionOperations);
                        this.mapper.CreateShiftCorrection(incomeCorrection.Id.Value, st.Id.Value);
                    }
                }

                if (outcomeCorrection != null)
                {
                    this.mapper.ValuateOutcomeWarehouseDocument(outcomeCorrection);
                }

                this.mapper.CreateCommunicationXml(incomeCorrection);

                if (outcomeCorrection != null)
                {
                    this.mapper.CreateCommunicationXml(outcomeCorrection);
                }

                this.mapper.CreateCommunicationXmlForDocumentRelations(operations);

                XDocument returnXml = XDocument.Parse(String.Format(CultureInfo.InvariantCulture, "<root><id>{0}</id></root>", incomeCorrection.Id.ToUpperString()));

                //Custom validation
                this.mapper.ExecuteOnCommitValidationCustomProcedure(incomeCorrection);
                if (outcomeCorrection != null)
                {
                    this.mapper.ExecuteOnCommitValidationCustomProcedure(outcomeCorrection);
                }

                if (this.coordinator.CanCommitTransaction)
                {
                    if (!ConfigurationMapper.Instance.ForceRollbackTransaction)
                    {
                        SqlConnectionManager.Instance.CommitTransaction();
                    }
                    else
                    {
                        SqlConnectionManager.Instance.RollbackTransaction();
                    }
                }

                return(returnXml);
            }
            catch (SqlException sqle)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:55");
                Coordinator.ProcessSqlException(sqle, document.BOType, this.coordinator.CanCommitTransaction);
                throw;
            }
            catch (Exception)
            {
                RoboFramework.Tools.RandomLogHelper.GetLog().Debug("FractusRefactorTraceCatch:56");
                if (this.coordinator.CanCommitTransaction)
                {
                    SqlConnectionManager.Instance.RollbackTransaction();
                }
                throw;
            }
        }