This commit is contained in:
2020-12-31 17:41:09 +00:00
parent 652c482cba
commit 09090d0752
4 changed files with 119 additions and 24 deletions

View File

@@ -73,10 +73,10 @@ namespace AyaNova.Biz
long l = 1;
do
{
newUniqueName = Util.StringUtil.UniqueNameBuilder(dbObject.Name, l++, 255);
NotUnique = await ct.Unit.AnyAsync(z => z.Name == newUniqueName);
newUniqueName = Util.StringUtil.UniqueNameBuilder(dbObject.Serial, l++, 255);
NotUnique = await ct.Unit.AnyAsync(z => z.Serial == newUniqueName);
} while (NotUnique);
newObject.Name = newUniqueName;
newObject.Serial = newUniqueName;
newObject.Id = 0;
newObject.Concurrency = 0;
await ct.Unit.AddAsync(newObject);
@@ -159,7 +159,7 @@ namespace AyaNova.Biz
return false;
ct.Unit.Remove(dbObject);
await ct.SaveChangesAsync();
await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct);
await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial, ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
@@ -202,9 +202,16 @@ namespace AyaNova.Biz
{
if (obj != null)
searchParams.AddText(obj.Notes)
.AddText(obj.Name)
.AddText(obj.Serial)
.AddText(obj.Wiki)
.AddText(obj.Tags)
.AddText(obj.Receipt)
.AddText(obj.Description)
.AddText(obj.WarrantyTerms)
.AddText(obj.Text1)
.AddText(obj.Text2)
.AddText(obj.Text3)
.AddText(obj.Text4)
.AddCustomFields(obj.CustomFields);
}
@@ -219,22 +226,23 @@ namespace AyaNova.Biz
bool isNew = currentObj == null;
//Name required
if (string.IsNullOrWhiteSpace(proposedObj.Name))
AddError(ApiErrorCode.VALIDATION_REQUIRED, "Name");
//Serial required
if (string.IsNullOrWhiteSpace(proposedObj.Serial))
AddError(ApiErrorCode.VALIDATION_REQUIRED, "Serial");
//If name is otherwise OK, check that name is unique
if (!PropertyHasErrors("Name"))
//If serial is otherwise OK, check that serial is unique for that unitmodelid (this is to catch dupes)
//(two different manufacturers products could have the same serial easily, but it's less likely for two different units of the same unitmodel)
//
if (!PropertyHasErrors("Serial"))
{
//Use Any command is efficient way to check existance, it doesn't return the record, just a true or false
if (await ct.Unit.AnyAsync(z => z.Name == proposedObj.Name && z.Id != proposedObj.Id))
if (await ct.Unit.AnyAsync(z => z.Serial == proposedObj.Serial && z.UnitModelId == proposedObj.UnitModelId && z.Id != proposedObj.Id))
{
AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Name");
AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Serial", "no two units can have the same serial and same unitmodel");
}
}
//Any form customizations to validate?
var FormCustomization = await ct.FormCustom.AsNoTracking().SingleOrDefaultAsync(z => z.FormKey == AyaType.Unit.ToString());
if (FormCustomization != null)

View File

@@ -103,8 +103,8 @@ namespace AyaNova.Models
[AUSESBANKING] [bit] NOT NULL,
[ACONTRACTID] [uniqueidentifier] NULL,
[ACONTRACTEXPIRES] [datetime] NULL,
[ALASTWORKORDERID] [uniqueidentifier] NULL,
[ALASTSERVICEDATE] [datetime] NULL,
[ALASTWORKORDERID] [uniqueidentifier] NULL,//dropped case 3536
[ALASTSERVICEDATE] [datetime] NULL,//dropped case 3536
[ADEFAULTSERVICETEMPLATEID] [uniqueidentifier] NULL,
[ACONTACTNOTES] [ntext] NULL,
[ACONTACT] [nvarchar](500) NULL,

View File

@@ -15,14 +15,35 @@ namespace AyaNova.Models
public long Id { get; set; }
public uint Concurrency { get; set; }
[Required]
public string Name { get; set; }
public bool Active { get; set; }
public string Notes { get; set; }
public string Wiki { get; set; }
public string CustomFields { get; set; }
public List<string> Tags { get; set; }
[Required]
public string Serial { get; set; }
[Required]
public long CustomerId { get; set; }
public long? ParentUnitId { get; set; }
public long? UnitModelId { get; set; }
public bool UnitHasOwnAddress { get; set; }
public bool BoughtHere { get; set; }
public long? PurchasedFromVendorId { get; set; }
public string Receipt { get; set; }
public DateTime? PurchasedDate { get; set; }
public string Description { get; set; }
public long? ReplacedByUnitId { get; set; }
public bool OverrideModelWarranty { get; set; }
public int? WarrantyLength { get; set; }
public string WarrantyTerms { get; set; }
public bool UsesBanking { get; set; }
public bool Metered { get; set; }
public bool LifeTimeWarranty { get; set; }
public string Text1 { get; set; }
public string Text2 { get; set; }
public string Text3 { get; set; }
public string Text4 { get; set; }
public Unit()
{
@@ -32,6 +53,63 @@ namespace AyaNova.Models
[NotMapped, JsonIgnore]
public AyaType AyaType { get => AyaType.Unit; }
//convenience links
[JsonIgnore]
public Customer Customer { get; set; }
[JsonIgnore]
public UnitModel UnitModel { get; set; }
[JsonIgnore]
public Unit ParentUnit { get; set; }
[JsonIgnore]
public Vendor PurchasedFromVendor { get; set; }
[JsonIgnore]
public Unit ReplacedByUnit { get; set; }
}//eoc
}//eons
/*
CREATE TABLE [dbo].[AUNIT](
[AID] [uniqueidentifier] NOT NULL,
[ACREATED] [datetime] NOT NULL,
[AMODIFIED] [datetime] NOT NULL,
[AACTIVE] [bit] NOT NULL,
[ACREATOR] [uniqueidentifier] NOT NULL,
[AMODIFIER] [uniqueidentifier] NOT NULL,
[ASERIAL] [nvarchar](255) NOT NULL,// MIGRATE: Can't make this unique, but *can* make it unique with the model id UNIQUE(aserial,aunitmodelid) to catch dupes
[ANOTES] [ntext] NULL,
[ACLIENTID] [uniqueidentifier] NULL,
[APARENTUNITID] [uniqueidentifier] NULL,
[AUNITMODELID] [uniqueidentifier] NULL,
[AUNITHASOWNADDRESS] [bit] NOT NULL,//do we need this? it only ever drove the UI, but I guess that's still valid
[ABOUGHTHERE] [bit] NOT NULL,
[APURCHASEDFROMID] [uniqueidentifier] NULL,
[ARECEIPT] [nvarchar](255) NULL,
[APURCHASEDDATE] [datetime] NULL,
[ADESCRIPTION] [nvarchar](255) NULL,
[AREPLACEDBYUNITID] [uniqueidentifier] NULL,
[AOVERRIDEMODELWARRANTY] [bit] NOT NULL,
[AWARRANTYTERMS] [nvarchar](255) NULL,
[ACUSTOM2] [ntext] NULL,
[ACUSTOM3] [ntext] NULL,
[ACUSTOM4] [ntext] NULL,
[ACUSTOM5] [ntext] NULL,
[ACUSTOM6] [ntext] NULL,
[ACUSTOM7] [ntext] NULL,
[ACUSTOM8] [ntext] NULL,
[ACUSTOM9] [ntext] NULL,
[ACUSTOM0] [ntext] NULL,
[ACUSTOM1] [ntext] NULL,
[AUSESBANKING] [bit] NOT NULL,
[AMETERED] [bit] NOT NULL,
[ALIFETIMEWARRANTY] [bit] NOT NULL,
[AWARRANTYLENGTH] [int] NULL,
[ALASTWORKORDERID] [uniqueidentifier] NULL,//MIGRATE: DROP as per case 3536, will determine live from query instead if necessary
[ALASTSERVICEDATE] [datetime] NULL,//MIGRATE: DROP case 3536
[ATEXT1] [nvarchar](255) NULL,
[ATEXT2] [nvarchar](255) NULL,
[ATEXT3] [nvarchar](255) NULL,
[ATEXT4] [nvarchar](255) NULL,
*/

View File

@@ -352,15 +352,15 @@ BEGIN
when 23 then aytable = 'apmtemplate';
when 24 then aytable = 'apmtemplateitem';
when 25 then aytable = 'aproject';
when 26 then aytable = 'apurchaseorder'; aynamecolumn ='serial';
when 27 then aytable = 'aquote'; aynamecolumn ='serial';
when 26 then aytable = 'apurchaseorder'; aynamecolumn = 'serial';
when 27 then aytable = 'aquote'; aynamecolumn = 'serial';
when 28 then aytable = 'aquoteitem';
when 29 then aytable = 'aquotetemplate';
when 30 then aytable = 'aquotetemplateitem';
when 31 then aytable = 'aunit';
when 31 then aytable = 'aunit'; aynamecolumn = 'serial';
when 32 then aytable = 'aunitmodel'; aynamecolumn = 'number';
when 33 then aytable = 'avendor';
when 34 then aytable = 'aworkorder'; aynamecolumn ='serial';
when 34 then aytable = 'aworkorder'; aynamecolumn = 'serial';
when 35 then return 'LT:WorkOrderItem';
when 36 then return 'LT:WorkOrderItemExpense';
when 37 then return 'LT:WorkOrderItemLabor';
@@ -715,11 +715,20 @@ $BODY$ LANGUAGE PLPGSQL STABLE");
await ExecQueryAsync("ALTER TABLE auser add FOREIGN KEY (vendorid) REFERENCES avendor(id)");
//UNIT
await ExecQueryAsync("CREATE TABLE aunit (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text not null unique, active bool, " +
"notes text, wiki text, customfields text, tags varchar(255) ARRAY )");
await ExecQueryAsync("CREATE UNIQUE INDEX aunit_name_id_idx ON aunit (id, name);");
await ExecQueryAsync("CREATE TABLE aunit (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, active bool, " +
"notes text, wiki text, customfields text, tags varchar(255) ARRAY, " +
"serial text not null, customerid bigint not null references acustomer(id), parentunitid bigint null references aunit(id), " +
"unitmodelid bigint null references aunitmodel(id), unithasownaddress bool, boughthere bool, purchasedfromvendorid bigint null references avendor(id), " +
"receipt text null, purchaseddate timestamp null, description text null, replacedbyunitid bigint null references aunit(id), " +
"overridemodelwarranty bool, warrantylength integer null, warrantyterms text null, usesbanking bool, metered bool, lifetimewarranty bool, " +
"text1 text null, text2 text null, text3 text null, text4 text null " +
" )");
// await ExecQueryAsync("CREATE UNIQUE INDEX aunit_name_id_idx ON aunit (id, name);");
await ExecQueryAsync("CREATE INDEX aunit_tags ON aunit using GIN(tags)");
//UNITMODEL
await ExecQueryAsync("CREATE TABLE aunitmodel (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text null, active bool, " +
"notes text, wiki text, customfields text, tags varchar(255) ARRAY, " +