public void AddTreeAuditRule(TreeAuditRule tar)
        {
            if (string.IsNullOrEmpty(tar.TreeAuditRuleID))
            {
                throw new ArgumentException("Value was null or empty", nameof(tar));
            }

            Database.Execute2(
                @"INSERT INTO TreeAuditRule (
    CruiseID,
    TreeAuditRuleID,
    Field,
    Min,
    Max,
    Description
) VALUES (
    @CruiseID,
    @TreeAuditRuleID,
    @Field,
    @Min,
    @Max,
    @Description
);",
                new
            {
                CruiseID,
                tar.TreeAuditRuleID,
                tar.Field,
                tar.Min,
                tar.Max,
                tar.Description,
            });
        }
        public void UpsertTreeAuditRule(TreeAuditRule tar)
        {
            if (string.IsNullOrEmpty(tar.TreeAuditRuleID))
            {
                throw new ArgumentException("Value was null or empty", nameof(tar));
            }

            Database.Execute2(
                @"INSERT INTO TreeAuditRule (
    CruiseID,
    TreeAuditRuleID,
    Field,
    Min,
    Max,
    Description
) VALUES (
    @CruiseID,
    @TreeAuditRuleID,
    @Field,
    @Min,
    @Max,
    @Description
)
ON CONFLICT (TreeAuditRuleID) DO
UPDATE SET
    Field = @Field,
    Min = @Min,
    Max = @Max,
    Description = @Description
WHERE TreeAuditRuleID = @TreeAuditRuleID;",
                new
            {
                CruiseID,
                tar.TreeAuditRuleID,
                tar.Field,
                tar.Min,
                tar.Max,
                tar.Description,
            });
        }
 public void DeleteTreeAuditRule(TreeAuditRule tar)
 {
     Database.Execute("DELETE FROM TreeAuditRule WHERE TreeAuditRuleID = @p1;", tar.TreeAuditRuleID);
 }
        public void ReadTreeAuditErrors_With_Two_AuditRules()
        {
            var init = new DatabaseInitializer();

            using var db = init.CreateDatabase();

            var tree = new Tree
            {
                CruiseID        = init.CruiseID,
                TreeID          = Guid.NewGuid().ToString(),
                TreeNumber      = 1,
                CuttingUnitCode = "u1",
                StratumCode     = "st3",
                SampleGroupCode = "sg1",
                SpeciesCode     = "sp1",
                CountOrMeasure  = "M",
                LiveDead        = "L",
            };

            db.Insert(tree);

            var tm = new TreeMeasurment
            {
                TreeID = tree.TreeID,
                DBH    = 101,
            };

            db.Insert(tm);

            var tar = new TreeAuditRule
            {
                CruiseID        = init.CruiseID,
                TreeAuditRuleID = Guid.NewGuid().ToString(),
                Field           = "DBH",
                Max             = 100,
            };

            db.Insert(tar);

            var tars = new TreeAuditRuleSelector
            {
                CruiseID        = init.CruiseID,
                TreeAuditRuleID = tar.TreeAuditRuleID,
                SpeciesCode     = "sp1",
                PrimaryProduct  = "01",
                LiveDead        = "L",
            };

            db.Insert(tars);

            var tfs = new TreeFieldSetup
            {
                CruiseID    = init.CruiseID,
                Field       = "DBH",
                StratumCode = "st3",
            };

            db.Insert(tfs);

            var tar2 = new TreeAuditRule
            {
                CruiseID        = init.CruiseID,
                TreeAuditRuleID = Guid.NewGuid().ToString(),
                Field           = "DBH",
                Max             = 99,
            };

            db.Insert(tar2);

            var tars2 = new TreeAuditRuleSelector
            {
                CruiseID        = init.CruiseID,
                TreeAuditRuleID = tar.TreeAuditRuleID,
                SpeciesCode     = "sp1",
            };

            db.Insert(tars2);

            var taeRecords = db.QueryGeneric("SELECT * FROM TreeAuditError").ToArray();

            taeRecords.Should().HaveCount(1); // not sure how to make TreeAuditErrors return only one error per tree, but its a low impact issue
        }