Пример #1
0
        private void ContinueWithLinkRecords(List <UPCRMRecord> linkRecords)
        {
            this.OpenChildRecords = null;
            string parentLinkString           = null;
            string sourceRecordIdentification = null;

            foreach (UPCRMRecord linkRecord in linkRecords)
            {
                UPCRMLink link = linkRecord.SingleLink;
                if (link == null)
                {
                    continue;
                }

                UPCRMRecord childRecord = link.Record;
                if (childRecord.Mode == "ParentUpdate" || !string.IsNullOrEmpty(sourceRecordIdentification))
                {
                    if (this.OpenChildRecords == null)
                    {
                        this.OpenChildRecords = new List <UPCRMRecord> {
                            childRecord
                        };
                    }
                    else
                    {
                        this.OpenChildRecords.Add(childRecord);
                    }

                    continue;
                }

                if (!childRecord.RecordIdentification.IsRecordIdentification())
                {
                    continue;
                }

                sourceRecordIdentification    = childRecord.RecordIdentification;
                this.CurrentCheckedLinkRecord = linkRecord;
                parentLinkString = link.LinkId > 0 ? $"{linkRecord.InfoAreaId}:{link.LinkId}" : linkRecord.InfoAreaId;
            }

            if (string.IsNullOrEmpty(parentLinkString) || string.IsNullOrEmpty(sourceRecordIdentification))
            {
                this.ContinueWithRecords(this.RecordsToSave);
                return;
            }

            this.LinkReader = new UPCRMLinkReader(sourceRecordIdentification, parentLinkString, UPRequestOption.FastestAvailable, this);
            if (!this.LinkReader.Start())
            {
                this.ContinueWithRecords(this.RecordsToSave);
            }
        }
        /// <summary>
        /// Returns changed child records list for given parent record
        /// </summary>
        /// <param name="parentRecord">Parent record</param>
        /// <param name="userChangesOnly">User changes only</param>
        /// <returns>
        ///   <see cref="List{UPCRMRecord}" />
        /// </returns>
        public override List <UPCRMRecord> ChangedChildRecordsForParentRecord(UPCRMRecord parentRecord, bool userChangesOnly)
        {
            List <UPCRMRecord> changedChildRecords = null;

            if (this.ChildEditContexts != null)
            {
                foreach (UPChildEditContext childEditContext in this.ChildEditContexts.Values)
                {
                    List <UPCRMRecord> records = this.ChangedRecordsForContextNewRecordLinkUserChangesOnly(childEditContext, false, null, userChangesOnly);
                    if (records?.Count > 0)
                    {
                        if (changedChildRecords != null)
                        {
                            changedChildRecords.AddRange(records);
                        }
                        else
                        {
                            changedChildRecords = new List <UPCRMRecord>(records);
                        }
                    }
                }

                if (this.AddedChildEditContexts != null)
                {
                    UPCRMLink link = new UPCRMLink(parentRecord, -1);
                    foreach (UPChildEditContext childEditContext in this.AddedChildEditContexts)
                    {
                        List <UPCRMRecord> records = this.ChangedRecordsForContextNewRecordLinkUserChangesOnly(childEditContext, true, link, userChangesOnly);
                        if (records?.Count > 0)
                        {
                            if (changedChildRecords != null)
                            {
                                changedChildRecords.AddRange(records);
                            }
                            else
                            {
                                changedChildRecords = new List <UPCRMRecord>(records);
                            }
                        }
                    }
                }
            }

            return(changedChildRecords?.Count > 0 ? changedChildRecords : null);
        }
        /// <summary>
        /// Returns changed links for given info area id
        /// </summary>
        /// <param name="infoAreaId">Info Area Id</param>
        /// <param name="userChangesOnly">Handles user changes only if set to true</param>
        /// <returns><see cref="Dictionary{string, UPCRMLink}"/></returns>
        public override Dictionary <string, UPCRMLink> ChangedLinksForInfoAreaId(string infoAreaId, bool userChangesOnly)
        {
            if (this.isNew && !userChangesOnly)
            {
                UPCRMLinkParticipant participant = this.ParticipantsControl.FirstLinkParticipant();
                if (!string.IsNullOrEmpty(participant?.LinkRecordIdentification))
                {
                    string val = participant.Options.ValueOrDefault("parentlink") as string;
                    if (Convert.ToInt32(val) != 0)
                    {
                        UPCRMLinkInfo linkInfo = UPCRMDataStore.DefaultStore.LinkInfoForInfoAreaTargetInfoAreaLinkId(infoAreaId, participant.LinkRecordIdentification.InfoAreaId(), 0);
                        if (linkInfo != null)
                        {
                            UPCRMLink link = new UPCRMLink(participant.LinkRecordIdentification);
                            return(new Dictionary <string, UPCRMLink> {
                                { linkInfo.Key, link }
                            });
                        }
                    }
                }
            }

            return(null);
        }
        /// <summary>
        /// Creates the record.
        /// </summary>
        /// <param name="record">The record.</param>
        /// <param name="undo">if set to <c>true</c> [undo].</param>
        /// <returns>Record</returns>
        public DAL.Record CreateRecord(UPCRMRecord record, bool undo)
        {
            string             infoAreaId = record.InfoAreaId;
            List <FieldIdType> fieldIds;
            List <string>      linkFieldNames;
            bool checkDataModel = true;

            TableInfo tableInfo = this.DatabaseInstance.GetTableInfoByInfoArea(infoAreaId);

            if (tableInfo == null)
            {
                return(null);
            }

            int  statNoField = 0, lnrField = 0;
            bool saveOfflineStationNumber = false;

            if (!undo && record.OfflineRecordNumber > 0 && record.OfflineStationNumber > 0)
            {
                statNoField = tableInfo.GetStatNoFieldId();
                if (statNoField >= 0)
                {
                    lnrField = tableInfo.GetLNrFieldId();
                    if (lnrField >= 0 && tableInfo.GetFieldInfo(statNoField) != null && tableInfo.GetFieldInfo(lnrField) != null)
                    {
                        saveOfflineStationNumber = true;
                    }
                }
            }

            List <UPCRMFieldValue> fieldValues = record.FieldValues;
            int fieldCount = fieldValues?.Count ?? 0;
            int linkCount  = record.Links?.Count ?? 0;

            if (undo)
            {
                linkCount = 0;
            }

            List <string> recordFieldValues = new List <string>();

            if (fieldCount == 0)
            {
                fieldIds = null;
            }
            else
            {
                fieldIds = new List <FieldIdType>();
                for (int i = 0; i < fieldCount; i++)
                {
                    UPCRMFieldValue fieldValue = fieldValues[i];
                    FieldInfo       fieldInfo  = tableInfo.GetFieldInfo(fieldValue.FieldId);
                    if (!checkDataModel || fieldInfo != null)
                    {
                        int currentFieldId = fieldValue.FieldId;
                        fieldIds.Add((FieldIdType)currentFieldId);
                        recordFieldValues.Add(undo ? fieldValue.OldValue : fieldValue.Value);

                        if (saveOfflineStationNumber && (currentFieldId == statNoField || currentFieldId == lnrField))
                        {
                            saveOfflineStationNumber = false;
                        }
                    }
                }

                if (saveOfflineStationNumber)
                {
                    fieldIds.Add((FieldIdType)statNoField);
                    recordFieldValues.Add(record.OfflineStationNumber.ToString());
                    fieldIds.Add((FieldIdType)lnrField);
                    recordFieldValues.Add(record.OfflineRecordNumber.ToString());
                }
            }

            if (record.Links != null && (record.Links.Count == 0 || undo))
            {
                linkFieldNames = null;
                linkCount      = 0;
            }
            else
            {
                linkFieldNames = new List <string>();
                for (int i = 0; i < linkCount; i++)
                {
                    UPCRMLink link     = record.Links[i];
                    LinkInfo  linkInfo = tableInfo.GetLink(link.LinkFieldName()) ??
                                         tableInfo.GetLink(link.InfoAreaId, link.LinkId);

                    if (linkInfo != null && linkInfo.HasColumn)
                    {
                        if (linkInfo.IsGeneric)
                        {
                            string targetInfoAreaId = this.RootPhysicalInfoAreaIdForInfoAreaId(link.InfoAreaId);
                            recordFieldValues.Add(targetInfoAreaId);
                            linkFieldNames.Add(linkInfo.InfoAreaColumnName);
                        }

                        recordFieldValues.Add(link.RecordId);
                        linkFieldNames.Add(linkInfo.ColumnName);
                    }
                }
            }

            var recordTemplate = new RecordTemplate(
                this.DatabaseInstance,
                false,
                infoAreaId,
                fieldIds?.Count ?? 0,
                fieldIds?.ToArray(),
                linkFieldNames.Count,
                linkFieldNames,
                false,
                false);

            Record rec = new Record(infoAreaId, record.RecordId);

            rec.SetTemplate(recordTemplate);
            for (var i = 0; i < recordFieldValues.Count; i++)
            {
                rec.SetValue(i, recordFieldValues[i]);
            }

            return(rec);
        }
 /// <summary>
 /// Adds the changed links from record parent link.
 /// </summary>
 /// <param name="record">
 /// The record.
 /// </param>
 /// <param name="parentLink">
 /// The parent link.
 /// </param>
 public void AddChangedLinksFromRecordParentLink(UPCRMRecord record, UPCRMLink parentLink)
 {
     // TODO
 }
        /// <summary>
        /// Applies the changes to serial entry.
        /// </summary>
        /// <param name="serialEntry">The serial entry.</param>
        /// <returns></returns>
        public UPOfflineSerialEntryApplyResult ApplyChangesToSerialEntry(/*UPSerialEntry*/ dynamic serialEntry)
        {
            UPOfflineSerialEntryApplyResult result = new UPOfflineSerialEntryApplyResult();
            bool ok = true;
            bool rowCreated;
            List <UPCRMRecordWithHierarchy> recordArray = new List <UPCRMRecordWithHierarchy>();

            foreach (UPCRMRecordWithHierarchy record in this.RecordStructure())
            {
                if (record.InfoAreaId == serialEntry.DestInfoAreaId)
                {
                    recordArray.Add(record);
                }

                if (record.InfoAreaId == serialEntry.Record.InfoAreaId)
                {
                    foreach (UPCRMRecordWithHierarchy subRecord in record.Children)
                    {
                        if (subRecord.InfoAreaId == serialEntry.DestInfoAreaId)
                        {
                            recordArray.Add(subRecord);
                        }
                    }
                }
            }

            foreach (UPCRMRecordWithHierarchy record in recordArray)
            {
                /*UPSERow*/
                dynamic row = serialEntry.ExistingRowForRecordIdentification(record.RecordIdentification);
                if (row == null)
                {
                    UPCRMLink link = record.LinkWithInfoAreaIdLinkId(serialEntry.SourceInfoAreaId, -1);
                    if (link == null)
                    {
                        continue;
                    }

                    row        = serialEntry.CreateRowForSourceRecordIdentification(link.RecordIdentification);
                    rowCreated = true;
                }
                else
                {
                    rowCreated = false;
                }

                if (row != null)
                {
                    bool recordsApplied = row.ApplyRecordHierarchy(record);
                    if (!recordsApplied)
                    {
                        ok = false;
                    }
                    else if (rowCreated)
                    {
                        serialEntry.AddPosition(row);
                    }
                }
            }

            if (!ok)
            {
                result.Error = new Exception("serial entry conflict handling was not implemented yet");
            }

            return(result);
        }
        /// <summary>
        /// Changeds the records for context new record link user changes only.
        /// </summary>
        /// <param name="childEditContext">The child edit context.</param>
        /// <param name="newRecord">if set to <c>true</c> [new record].</param>
        /// <param name="link">The link.</param>
        /// <param name="userChangesOnly">if set to <c>true</c> [user changes only].</param>
        /// <returns></returns>
        public List <UPCRMRecord> ChangedRecordsForContextNewRecordLinkUserChangesOnly(UPChildEditContext childEditContext, bool newRecord, UPCRMLink link, bool userChangesOnly)
        {
            if (childEditContext.DeleteRecord)
            {
                if (newRecord)
                {
                    return(null);
                }

                UPCRMRecord record = new UPCRMRecord(childEditContext.RecordIdentification);
                record.Deleted = true;
                return(new List <UPCRMRecord> {
                    record
                });
            }

            Dictionary <string, UPEditFieldContext> changedFields = null;

            if (newRecord && !userChangesOnly)
            {
                if (this.combinedInitialValues != null)
                {
                    foreach (string fieldIdentification in this.combinedInitialValues.Keys)
                    {
                        int fieldId = fieldIdentification.FieldIdFromStringWithInfoAreaId(this.ChildInfoAreaId);
                        if (fieldId >= 0)
                        {
                            UPEditFieldContext initialValueEditField = new UPEditFieldContext(fieldId, this.combinedInitialValues[fieldIdentification] as string);
                            if (changedFields == null)
                            {
                                changedFields = new Dictionary <string, UPEditFieldContext> {
                                    { initialValueEditField.Key, initialValueEditField }
                                };
                            }
                            else
                            {
                                changedFields.SetObjectForKey(initialValueEditField, initialValueEditField.Key);
                            }
                        }
                    }
                }
            }

            foreach (UPEditFieldContext editFieldContext in childEditContext.EditFieldContext.Values)
            {
                if (editFieldContext.WasChanged(userChangesOnly))
                {
                    if (changedFields != null)
                    {
                        changedFields.SetObjectForKey(editFieldContext, editFieldContext.Key);
                    }
                    else
                    {
                        changedFields = new Dictionary <string, UPEditFieldContext> {
                            { editFieldContext.Key, editFieldContext }
                        };
                    }
                }
            }

            List <UPCRMRecord>      additionalRecords = null;
            ICollection <UPCRMLink> changedLinks      = (ICollection <UPCRMLink>)childEditContext.ChangedLinkArray ?? new List <UPCRMLink>();

            if (changedFields?.Count > 0 || changedLinks?.Count > 0)
            {
                UPCRMRecord record;
                if (newRecord)
                {
                    record = childEditContext.RecordIdentification.RecordId().Length > 6
                        ? new UPCRMRecord(childEditContext.RecordIdentification)
                        : UPCRMRecord.CreateNew(childEditContext.RecordIdentification.InfoAreaId());

                    record.AddLink(link);
                    UPConfigFilter createFilter = ConfigurationUnitStore.DefaultStore.FilterByName($"{record.InfoAreaId}.ChildCreateTemplate");
                    createFilter      = createFilter.FilterByApplyingDefaultReplacements();
                    additionalRecords = record.ApplyValuesFromTemplateFilter(createFilter, false);
                }
                else
                {
                    record = new UPCRMRecord(childEditContext.RecordIdentification);
                }

                foreach (UPEditFieldContext changedField in changedFields.Values)
                {
                    if (newRecord)
                    {
                        record.NewValueFieldId(changedField.Value, changedField.FieldId);
                    }
                    else
                    {
                        record.NewValueFromValueFieldId(changedField.Value, changedField.OriginalValue, changedField.FieldId);
                    }
                }

                foreach (UPCRMLink changedLink in changedLinks)
                {
                    record.AddLink(changedLink);
                }

                if (additionalRecords?.Count > 0)
                {
                    List <UPCRMRecord> arr = new List <UPCRMRecord> {
                        record
                    };
                    arr.AddRange(additionalRecords);
                    return(arr);
                }

                return(new List <UPCRMRecord> {
                    record
                });
            }

            return(null);
        }