<?xml version="1.0" encoding="utf-8"?>
<AlvaoApplication xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ModelVersion="1">
  <Applications>
    <Application id="45">
      <Name>Asset Check Automation</Name>
      <Description>Automates asset check status update. When assets are manually moved or when check-in data is received from supported connectors - such as Microsoft Intune, Jamf, Zabbix, and others - the asset status is automatically set to Found. If no activity is detected within the past six months, the asset is marked for asset check.</Description>
      <UniqueId>5ab6a5b7-b08a-42bb-bd92-0879468afa12</UniqueId>
      <Version>3</Version>
      <AdvancedSettings />
      <Scripts>
        <Script id="103">
          <Name>AutomaticAssetCheck</Name>
          <Code>using System;
using System.Data;
using Microsoft.Data.SqlClient;
using Alvao.Apps.API;
using Alvao.Context;
using Dapper;
using Alvao.API.Common;

class ObjectMoveAutoAction : IObjectMoveAutoAction
{
    public Tuple&lt;bool, string&gt; OnObjectMoving(SqlConnection con, int objectId, int newParentObjectId, int personId)
    {
        throw new NotImplementedException();
    }

    public void OnObjectMoved(SqlConnection con, int objectId, int oldParentObjectId, int personId)
    {
        if (!Activation.IsModuleActivated(Alvao.Global.ModuleInfo.ModuleId.AMAutopilot))
        {
            throw new Exception("AMAutopilot module is not activated.");
        }
       var obj = Alvao.API.AM.Object.GetById(personId, objectId);
       if (obj.lintClassId == (int)Alvao.API.AM.Model.ObjectClass.Code.SpecObjTrash)
       {
           return;
       }
       if (Alvao.API.AM.ObjectProperty.TemplateContains(obj.lintClassId ?? 0, Alvao.API.Common.Model.Database.tblKind.KindCode.LastFoundAssetCheck))
       {
           Alvao.API.AM.ObjectProperty.Update(objectId, Alvao.API.Common.Model.Database.tblKind.KindCode.LastFoundAssetCheck, DateTime.Now.Date, false, true);
       }
    }
}</Code>
          <IsLibCode>false</IsLibCode>
          <Codesign>roE+43BqOhvn9KXCU6TP6IkBfJG2RlsNMxX5Ik5v0YO3tKLxhwecMW9FahVrYKkgdLmnpt39SRA+J9fK7/L5b3gEs+y0Y6ML9pBC1EVMpwg1tNMMBi2Y2ncmyHF/QPZbSQ/DVVFCmtQFpwyQkjdVJQyDcb6b2fFIah87CvHzBonDA6XkaJKLZJ+Jpd5QR3PWr3nue4Pa6lWRZoKW236CTJdMvfHHW1aGSQ3uUBkdTgUiFpZUPNj3f/ry2G8a7bC+9TWXdxLfsA+uyKFP9emutfT5ltp3YrBtk9Kceo/pIYFuXBakgV28Vm2vLSThc9jrTBw5agqrpsmu9o2TDE+JVQ==</Codesign>
        </Script>
        <Script id="104">
          <Name>PeriodicAssetCheckPending</Name>
          <Code>using System;
using System.Data;
using Microsoft.Data.SqlClient;
using Alvao.Global;
using Alvao.API.Common;
using Alvao.Apps.API;
using Alvao.Context;
using Dapper;
using System.Collections.Generic;
using Alvao.API.Common.Model.Database;
using System.Linq;

public class PeriodicAssetCheckPending : IPeriodicAction
{
    public string Name 
    { 
        get =&gt; "Asset check pending after 6 months";
        set { }
    }

    public void OnPeriod(SqlConnection con)
    {
        if (!Activation.IsModuleActivated(Alvao.Global.ModuleInfo.ModuleId.AMAutopilot))
        {
            throw new Exception("AMAutopilot module is not activated.");
        }
        DateTime serverTime = DateTime.Now;
        if (serverTime.Hour == 2)
        {
            using (var scope = AlvaoContext.GetConnectionScope())
            {
                string sql = @$"select p.NodeId from NodeCust p 
                inner join tblNode tn on p.NodeId = tn.intNodeId
                inner join ClassKind ck on tn.lintClassId =  ck.ClassId 
                inner join tblKind tk on ck.KindId = tk.intKindId 
                where AssetCheckDate &lt; DATEADD(MONTH, -6, GETDATE())
                AND tn.IsRemoved = 0 AND tn.IsDiscarded = 0
                AND tk.intKindCode = 178
                ";
                var nodeIds = scope.Connection.Query&lt;int&gt;(sql, new { }, transaction: scope.Transaction).ToList();
                string pending = Alvao.API.AM.ObjectProperty.GetValueList(0, (int)Alvao.API.Common.Model.Database.tblKind.KindCode.StatusAssetCheck).ToList()[1].txtValue;

                foreach (int id in nodeIds)
                {
                    Alvao.API.AM.ObjectProperty.Update(id, tblKind.KindCode.StatusAssetCheck, pending, false, true);
                }
            }
        }
    }
}</Code>
          <IsLibCode>false</IsLibCode>
          <Codesign>krxIE7kjMgaXMCZ2+z5FBdzWxpiwgfxN7j8vKDYVnCKqZ6NarAyoFDU+ui5SqALPrRltN7er0fhwoURV39bf5/wWGcvewuUwtePWZGVF3I6ZpFprPFfZHzv8BW82PEO07Nf1wjiqVinHk0t/9C2s12GiYWfc/CbxypgJ/tLi1lI2uqtxbKTS6womN+Wd54JBVNHjGSHdubQtMu7Sgqz0Wpe1g69mlZdUHHFqfCTUkRh3/w04mLuTsnvVHHULr0YzDOJSnbhqvr6www6HcSeq6z4wWAzurfcWMAbLMPFu+cUW0rhvf9Oh6KMlDTFvpboMTx1ivapcgGgd7BbDCG6fKg==</Codesign>
        </Script>
        <Script id="106">
          <Name>ObjectPropertyAutoAction</Name>
          <Code>using System;
using System.Data;
using Microsoft.Data.SqlClient;
using Alvao.Apps.API;
using Alvao.Context;
using Dapper;
using System.Collections.Generic;
using Alvao.API.Common.Model.Database;
using Alvao.API.Common;
using System.Linq;

class ObjectPropertyAutoAction : IObjectPropertyAutoAction
{
    public ObjectPropertyModifyResult OnObjectPropertyModifying(ObjectPropertyEventArgs e)
    {
        throw new NotImplementedException();
    }

    public void OnObjectPropertyModified(ObjectPropertyEventArgs e)
    {
        if (!Activation.IsModuleActivated(Alvao.Global.ModuleInfo.ModuleId.AMAutopilot))
        {
            throw new Exception("AMAutopilot module is not activated.");
        }
        var allowedProps = new List&lt;tblKind.KindCode&gt;()
        {
            tblKind.KindCode.IntuneLastCheckIn,
            tblKind.KindCode.JamfLastCheckIn,
            tblKind.KindCode.AlvaoAgentLastCheckIn,
            tblKind.KindCode.ZabbixLastCheckIn,
            tblKind.KindCode.LansweeperLastCheckIn
        };
        var property = Alvao.API.AM.ObjectProperty.GetDefinition(e.PropertyKindId);
        if (allowedProps.Contains((tblKind.KindCode)property.intKindCode))
        {
            if (e.NewValue == null)
                return;
            string strDate = e.NewValue.ToString();
            if (DateTime.TryParse(strDate, out DateTime dateValue))
            {
                Alvao.API.AM.ObjectProperty.Update(e.ObjectId, tblKind.KindCode.LastFoundAssetCheck, dateValue, true, false);
            }
            var propertyValues = Alvao.API.AM.ObjectProperty.GetValueList(0, (int)Alvao.API.Common.Model.Database.tblKind.KindCode.StatusAssetCheck).ToList();
            var kindValue = Alvao.API.AM.ObjectProperty.GetValuesByKindCodes(e.ObjectId, new[] { tblKind.KindCode.StatusAssetCheck }).FirstOrDefault().Value;
            var pendingValue = propertyValues[1].txtValue;
            var foundValue = propertyValues[2].txtValue;
            if (kindValue == pendingValue)
            {
                Alvao.API.AM.ObjectProperty.Update(e.ObjectId, tblKind.KindCode.StatusAssetCheck, foundValue, false);
            }
        }
    }
}</Code>
          <IsLibCode>false</IsLibCode>
          <Codesign>ahxmInG+Us6uMT3Uy3SyYTelLnK3R5zIFqaVd3D+4dXck3CVeOGa2pyNeB9ydI0QUn0JIhuga+vzMDZMIp6v9BxNYrj+nPbWyMbecYQ91MEIBpKoujAapstPifX2m0mEnGz58veKhA/X2H44YZ3+45XHU9GpktInFLwIrmNNPiRUp+TJNpUTAcnsMrlA/RGIRnlYixiFk3YfcSiyRot03ghmLJ6WV0g+yyCueDUL/VgzjEGCCwkMvdxAPJbanC0F+xZSpFLpcUWu1Ckz1gDryS6C90LHNBbg5fbsoepB6rBr3umDyLReb3UhgQaHVfyQwqiZG+F+cb0pYKQbld7ufA==</Codesign>
        </Script>
      </Scripts>
    </Application>
  </Applications>
</AlvaoApplication>