This commit is contained in:
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -53,7 +53,7 @@
|
|||||||
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
|
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
|
||||||
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
|
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
|
||||||
"AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles",
|
"AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles",
|
||||||
"AYANOVA_SERVER_TEST_MODE": "false",
|
"AYANOVA_SERVER_TEST_MODE": "true",
|
||||||
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small",
|
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small",
|
||||||
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7",
|
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7",
|
||||||
"AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\"
|
"AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\"
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ namespace AyaNova.Biz
|
|||||||
newObject.EntryDate = DateTime.UtcNow;
|
newObject.EntryDate = DateTime.UtcNow;
|
||||||
newObject.PartId = newDtObject.PartId;
|
newObject.PartId = newDtObject.PartId;
|
||||||
newObject.PartWarehouseId = newDtObject.PartWarehouseId;
|
newObject.PartWarehouseId = newDtObject.PartWarehouseId;
|
||||||
newObject.SourceId = 0;
|
newObject.SourceId = null;
|
||||||
newObject.SourceType = AyaType.NoType;
|
newObject.SourceType = null;
|
||||||
newObject.Quantity = newDtObject.Quantity;
|
newObject.Quantity = newDtObject.Quantity;
|
||||||
|
|
||||||
if (LastEntry != null)
|
if (LastEntry != null)
|
||||||
@@ -162,6 +162,7 @@ namespace AyaNova.Biz
|
|||||||
private async Task ValidateAsync(PartInventory proposedObj)
|
private async Task ValidateAsync(PartInventory proposedObj)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//NOTE: Many of these errors wouldn't happen in the official ayanova UI (api developer error only) so are not translated
|
||||||
if (!await BizObjectExistsInDatabase.ExistsAsync(AyaType.Part, proposedObj.PartId, ct))
|
if (!await BizObjectExistsInDatabase.ExistsAsync(AyaType.Part, proposedObj.PartId, ct))
|
||||||
{
|
{
|
||||||
AddError(ApiErrorCode.NOT_FOUND, "generalerror", $"PartInventory Part specified doesn't exist [id:{proposedObj.PartId}]");
|
AddError(ApiErrorCode.NOT_FOUND, "generalerror", $"PartInventory Part specified doesn't exist [id:{proposedObj.PartId}]");
|
||||||
@@ -174,21 +175,18 @@ namespace AyaNova.Biz
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proposedObj.SourceType != AyaType.NoType && proposedObj.SourceId != 0 && !await BizObjectExistsInDatabase.ExistsAsync(proposedObj.SourceType, proposedObj.SourceId, ct))
|
//Source id and type must either both be null or neither be null
|
||||||
|
if ((proposedObj.SourceId == null && proposedObj.SourceType != null) || (proposedObj.SourceId != null && proposedObj.SourceType == null))
|
||||||
{
|
{
|
||||||
AddError(ApiErrorCode.NOT_FOUND, "generalerror", $"PartInventory source object causing inventory change specified doesn't exist [type:{proposedObj.SourceType}, id:{proposedObj.SourceId}]");
|
AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "generalerror", "Source type and id must be specified or both null for a manual adjustment");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (proposedObj.SourceType != null && proposedObj.SourceId != null && !await BizObjectExistsInDatabase.ExistsAsync((AyaType)proposedObj.SourceType, (long)proposedObj.SourceId, ct))
|
||||||
/*
|
{
|
||||||
"CONSTRAINT UNQ_PartInventory UNIQUE (sourceid, sourcetype, entrydate, balance), " +
|
AddError(ApiErrorCode.NOT_FOUND, "generalerror", $"PartInventory source object causing inventory change specified doesn't exist [type:{proposedObj.SourceType}, id:{proposedObj.SourceId}]");
|
||||||
"CONSTRAINT UNQ_PartInventory_Previous_values UNIQUE (sourceid, sourcetype, lastentrydate, lastbalance), " +
|
return;
|
||||||
"CONSTRAINT fk_PartInventory_self FOREIGN KEY (sourceid, sourcetype, lastentrydate, lastbalance) references apartinventory(sourceid, sourcetype, entrydate, balance), " +
|
}
|
||||||
"CONSTRAINT CHK_PartInventory_Valid_Balance CHECK(balance >= 0 AND (balance = COALESCE(lastbalance, 0) + quantity)), " +
|
|
||||||
"CONSTRAINT CHK_PartInventory_Valid_Dates_Sequence CHECK(lastentrydate < entrydate), " +
|
|
||||||
"CONSTRAINT CHK_PartInventory_Valid_Previous_Columns CHECK((lastentrydate IS NULL AND lastbalance IS NULL) OR (lastentrydate IS NOT NULL AND lastbalance IS NOT NULL)) " +
|
|
||||||
*/
|
|
||||||
|
|
||||||
//New entry must have *something* to bank
|
//New entry must have *something* to bank
|
||||||
if (proposedObj.Quantity == 0)
|
if (proposedObj.Quantity == 0)
|
||||||
@@ -214,8 +212,6 @@ namespace AyaNova.Biz
|
|||||||
|
|
||||||
//valid previous columns?
|
//valid previous columns?
|
||||||
//either they're all null or none of them are null
|
//either they're all null or none of them are null
|
||||||
|
|
||||||
//fix and re-test
|
|
||||||
if (!((proposedObj.LastEntryDate == null
|
if (!((proposedObj.LastEntryDate == null
|
||||||
&& proposedObj.LastBalance == null) ||
|
&& proposedObj.LastBalance == null) ||
|
||||||
(proposedObj.LastEntryDate != null
|
(proposedObj.LastEntryDate != null
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ namespace AyaNova.Models
|
|||||||
public long PartId { get; set; }
|
public long PartId { get; set; }
|
||||||
[Required]
|
[Required]
|
||||||
public long PartWarehouseId { get; set; }
|
public long PartWarehouseId { get; set; }
|
||||||
[Required]
|
|
||||||
public long SourceId { get; set; }
|
public long? SourceId { get; set; }
|
||||||
[Required]
|
public AyaType? SourceType { get; set; }
|
||||||
public AyaType SourceType { get; set; }
|
|
||||||
[Required]
|
[Required]
|
||||||
public decimal Quantity { get; set; }
|
public decimal Quantity { get; set; }
|
||||||
[Required]
|
[Required]
|
||||||
@@ -39,9 +39,7 @@ namespace AyaNova.Models
|
|||||||
|
|
||||||
public PartInventory()
|
public PartInventory()
|
||||||
{
|
{
|
||||||
EntryDate = DateTime.UtcNow;
|
EntryDate = DateTime.UtcNow;
|
||||||
SourceId = 0;
|
|
||||||
SourceType = AyaType.NoType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -691,7 +691,7 @@ $BODY$ LANGUAGE PLPGSQL STABLE");
|
|||||||
//PART INVENTORY
|
//PART INVENTORY
|
||||||
await ExecQueryAsync("CREATE TABLE apartinventory (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, description TEXT NULL, " +
|
await ExecQueryAsync("CREATE TABLE apartinventory (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, description TEXT NULL, " +
|
||||||
"entrydate TIMESTAMP NOT NULL, lastentrydate TIMESTAMP NULL, partid BIGINT NOT NULL REFERENCES apart, partwarehouseid BIGINT NOT NULL REFERENCES apartwarehouse, " +
|
"entrydate TIMESTAMP NOT NULL, lastentrydate TIMESTAMP NULL, partid BIGINT NOT NULL REFERENCES apart, partwarehouseid BIGINT NOT NULL REFERENCES apartwarehouse, " +
|
||||||
"sourcetype INTEGER NOT NULL, sourceid BIGINT NOT NULL, " +
|
"sourcetype INTEGER, sourceid BIGINT, " +
|
||||||
"quantity DECIMAL(19,4) NOT NULL, balance DECIMAL(19,4) NOT NULL, lastbalance DECIMAL(19,4) NULL, " +
|
"quantity DECIMAL(19,4) NOT NULL, balance DECIMAL(19,4) NOT NULL, lastbalance DECIMAL(19,4) NULL, " +
|
||||||
"CONSTRAINT unq_partinventory UNIQUE (sourceid, sourcetype, entrydate, balance), " +
|
"CONSTRAINT unq_partinventory UNIQUE (sourceid, sourcetype, entrydate, balance), " +
|
||||||
"CONSTRAINT unq_partinventory_previous_values UNIQUE (sourceid, sourcetype, lastentrydate, lastbalance), " +
|
"CONSTRAINT unq_partinventory_previous_values UNIQUE (sourceid, sourcetype, lastentrydate, lastbalance), " +
|
||||||
@@ -699,6 +699,7 @@ $BODY$ LANGUAGE PLPGSQL STABLE");
|
|||||||
"CONSTRAINT chk_partinventory_valid_balance CHECK(balance >= 0 AND (balance = COALESCE(lastbalance, 0) + quantity)), " +
|
"CONSTRAINT chk_partinventory_valid_balance CHECK(balance >= 0 AND (balance = COALESCE(lastbalance, 0) + quantity)), " +
|
||||||
"CONSTRAINT chk_partinventory_valid_dates_sequence CHECK(lastentrydate < entrydate), " +
|
"CONSTRAINT chk_partinventory_valid_dates_sequence CHECK(lastentrydate < entrydate), " +
|
||||||
"CONSTRAINT chk_partinventory_valid_previous_columns CHECK((lastentrydate IS NULL AND lastbalance IS NULL) OR (lastentrydate IS NOT NULL AND lastbalance IS NOT NULL)) " +
|
"CONSTRAINT chk_partinventory_valid_previous_columns CHECK((lastentrydate IS NULL AND lastbalance IS NULL) OR (lastentrydate IS NOT NULL AND lastbalance IS NOT NULL)) " +
|
||||||
|
"CONSTRAINT chk_partinventory_valid_source CHECK((sourcetype IS NULL AND sourceid IS NULL) OR (sourcetype IS NOT NULL AND sourceid IS NOT NULL)) " +
|
||||||
" )");
|
" )");
|
||||||
|
|
||||||
//PART INVENTORY VIEW
|
//PART INVENTORY VIEW
|
||||||
|
|||||||
Reference in New Issue
Block a user