/// <summary>
        /// Reset the values on the 'Components' grid and loads the Component registers from the selected 'ItemClass' for the current 'InventoryItem' ('StockItem').
        /// </summary>
        public virtual void ResetValuesFromItemClass(PXCache cache, InventoryItem inventoryItemRow, int?itemClassID)
        {
            if (PXAccess.FeatureInstalled <FeaturesSet.equipmentManagementModule>() == false)
            {
                return;
            }

            if (inventoryItemRow != null && inventoryItemRow.ItemClassID != null)
            {
                using (var ts = new PXTransactionScope())
                {
                    INItemClass inItemClassRow = PXSelect <INItemClass,
                                                           Where <
                                                               INItemClass.itemClassID, Equal <Required <INItemClass.itemClassID> > > >
                                                 .Select(Base, itemClassID);

                    FSxEquipmentModelTemplate fsxEquipmentModelTemplateRow = Base.ItemClass.Cache.GetExtension <FSxEquipmentModelTemplate>(inItemClassRow);
                    FSxEquipmentModel         fsxEquipmentModelRow         = cache.GetExtension <FSxEquipmentModel>(inventoryItemRow);

                    var fsModelTemplateComponentSet = PXSelect <FSModelTemplateComponent,
                                                                Where <
                                                                    FSModelTemplateComponent.modelTemplateID, Equal <Required <FSModelTemplateComponent.modelTemplateID> >,
                                                                    And <FSModelTemplateComponent.active, Equal <True> > > >
                                                      .Select(Base, itemClassID);

                    fsxEquipmentModelRow.EQEnabled          = fsxEquipmentModelTemplateRow.EQEnabled;
                    fsxEquipmentModelRow.EquipmentItemClass = fsxEquipmentModelTemplateRow.EquipmentItemClass;
                    fsxEquipmentModelRow.ModelType          = fsxEquipmentModelTemplateRow.DfltModelType;

                    foreach (FSModelComponent fsModelComponentRow in ModelComponents.Select())
                    {
                        ModelComponents.Delete(fsModelComponentRow);
                    }

                    foreach (FSModelTemplateComponent fsModelTemplateComponentRow in fsModelTemplateComponentSet)
                    {
                        if (fsxEquipmentModelTemplateRow.EQEnabled == true)
                        {
                            FSModelComponent fsModelComponentRow = new FSModelComponent();
                            fsModelComponentRow.Active      = fsModelTemplateComponentRow.Active;
                            fsModelComponentRow.ComponentID = fsModelTemplateComponentRow.ComponentID;
                            fsModelComponentRow.Descr       = fsModelTemplateComponentRow.Descr;
                            fsModelComponentRow.ClassID     = fsModelTemplateComponentRow.ClassID;
                            fsModelComponentRow.Optional    = fsModelTemplateComponentRow.Optional;
                            fsModelComponentRow.Qty         = fsModelTemplateComponentRow.Qty;

                            ModelComponents.Cache.Insert(fsModelComponentRow);
                        }
                    }

                    ts.Complete();
                }
            }
        }
        private void CheckComponentsClassID(FSxEquipmentModelTemplate fsxEquipmentModelTemplateRow)
        {
            if (fsxEquipmentModelTemplateRow == null &&
                fsxEquipmentModelTemplateRow.EquipmentItemClass != ID.Equipment_Item_Class.MODEL_EQUIPMENT)
            {
                return;
            }

            foreach (FSModelTemplateComponent fsModelTemplateComponentRow in ModelTemplateComponentRecords.Select())
            {
                if (ModelTemplateComponentRecords.Cache.GetStatus(fsModelTemplateComponentRow) == PXEntryStatus.Notchanged &&
                    fsModelTemplateComponentRow.ClassID == null)
                {
                    FSModelTemplateComponent aux = fsModelTemplateComponentRow;
                    ModelTemplateComponentRecords.Cache.SetStatus(fsModelTemplateComponentRow, PXEntryStatus.Updated);
                }
            }
        }
        /// <summary>
        /// Enables or disables fields.
        /// </summary>
        private void EnableDisable(PXCache cache, INItemClass itemClassRow)
        {
            bool isEnabledAsModelTemplate = false;
            bool isStkItem = itemClassRow.StkItem == true;

            FSxServiceClass fsxServiceClassRow = cache.GetExtension <FSxServiceClass>(itemClassRow);

            PXUIFieldAttribute.SetEnabled <FSxServiceClass.dfltBillingRule>(cache, itemClassRow, itemClassRow.ItemType == INItemTypes.ServiceItem);

            EnableDisable_ItemType(cache, itemClassRow, fsxServiceClassRow);

            ModelTemplateComponentRecords.AllowSelect = false;

            if (PXAccess.FeatureInstalled <FeaturesSet.equipmentManagementModule>())
            {
                FSxEquipmentModelTemplate fsxEquipmentModelTemplateRow = cache.GetExtension <FSxEquipmentModelTemplate>(itemClassRow);

                isEnabledAsModelTemplate = fsxEquipmentModelTemplateRow.EQEnabled == true &&
                                           fsxEquipmentModelTemplateRow.EquipmentItemClass == ID.Equipment_Item_Class.MODEL_EQUIPMENT;

                fsxEquipmentModelTemplateRow.Mem_ShowComponent = isEnabledAsModelTemplate;
                PXUIFieldAttribute.SetEnabled <FSxEquipmentModelTemplate.equipmentItemClass>(cache, itemClassRow, isStkItem);
                PXUIFieldAttribute.SetEnabled <FSxEquipmentModelTemplate.eQEnabled>(cache, itemClassRow, isStkItem);
                PXUIFieldAttribute.SetEnabled <FSxEquipmentModelTemplate.dfltModelType>(cache, itemClassRow, isEnabledAsModelTemplate);
                PXDefaultAttribute.SetPersistingCheck <FSxEquipmentModelTemplate.dfltModelType>(
                    cache,
                    itemClassRow,
                    isEnabledAsModelTemplate == true ? PXPersistingCheck.NullOrBlank : PXPersistingCheck.Nothing);

                ModelTemplateComponentRecords.AllowSelect = fsxEquipmentModelTemplateRow.Mem_ShowComponent == true;
            }

            ModelTemplateComponentRecords.Cache.AllowInsert = isEnabledAsModelTemplate;
            ModelTemplateComponentRecords.Cache.AllowUpdate = isEnabledAsModelTemplate;
            ModelTemplateComponentRecords.Cache.AllowDelete = isEnabledAsModelTemplate;

            if (isEnabledAsModelTemplate == false)
            {
                ModelTemplateComponentRecords.Cache.Clear();
            }
        }
        protected virtual void INItemClass_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
        {
            if (e.Row == null)
            {
                return;
            }

            INItemClass     itemClassRow       = (INItemClass)e.Row;
            FSxServiceClass fsxServiceClassRow = cache.GetExtension <FSxServiceClass>(itemClassRow);

            if (string.IsNullOrEmpty(fsxServiceClassRow.DfltBillingRule))
            {
                cache.RaiseExceptionHandling <FSxServiceClass.dfltBillingRule>(e.Row, fsxServiceClassRow.DfltBillingRule, new PXException(PX.Objects.FS.TX.Error.FIELD_EMPTY));
                e.Cancel = true;
            }

            if (PXAccess.FeatureInstalled <FeaturesSet.equipmentManagementModule>())
            {
                FSxEquipmentModelTemplate fsxEquipmentModelTemplateRow = cache.GetExtension <FSxEquipmentModelTemplate>(itemClassRow);
                CheckComponentsClassID(fsxEquipmentModelTemplateRow);
            }
        }