This commit is contained in:
@@ -922,6 +922,12 @@ namespace AyaNova.Biz
|
|||||||
l.Add(new FormField { TKey = "WorkOrderItemExpenseReimburseUser", FieldKey = "WorkOrderItemExpenseReimburseUser", TKeySection = "WorkOrderItemExpense" });
|
l.Add(new FormField { TKey = "WorkOrderItemExpenseReimburseUser", FieldKey = "WorkOrderItemExpenseReimburseUser", TKeySection = "WorkOrderItemExpense" });
|
||||||
l.Add(new FormField { TKey = "WorkOrderItemExpenseTotalCost", FieldKey = "WorkOrderItemExpenseTotalCost", TKeySection = "WorkOrderItemExpense" });
|
l.Add(new FormField { TKey = "WorkOrderItemExpenseTotalCost", FieldKey = "WorkOrderItemExpenseTotalCost", TKeySection = "WorkOrderItemExpense" });
|
||||||
l.Add(new FormField { TKey = "WorkOrderItemExpenseUserID", FieldKey = "WorkOrderItemExpenseUserID", TKeySection = "WorkOrderItemExpense" });
|
l.Add(new FormField { TKey = "WorkOrderItemExpenseUserID", FieldKey = "WorkOrderItemExpenseUserID", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "TaxCodeTaxA", FieldKey = "ExpenseTaxAPct", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "TaxCodeTaxB", FieldKey = "ExpenseTaxBPct", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "TaxCodeTaxOnTax", FieldKey = "ExpenseTaxOnTax", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "TaxAAmt", FieldKey = "ExpenseTaxAViz", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "TaxBAmt", FieldKey = "ExpenseTaxBViz", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
l.Add(new FormField { TKey = "LineTotal", FieldKey = "ExpenseLineTotalViz", TKeySection = "WorkOrderItemExpense" });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -939,7 +945,7 @@ namespace AyaNova.Biz
|
|||||||
l.Add(new FormField { TKey = "Cost", FieldKey = "LaborCost", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "Cost", FieldKey = "LaborCost", TKeySection = "WorkOrderItemLabors" });
|
||||||
l.Add(new FormField { TKey = "ListPrice", FieldKey = "LaborListPrice", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "ListPrice", FieldKey = "LaborListPrice", TKeySection = "WorkOrderItemLabors" });
|
||||||
l.Add(new FormField { TKey = "Price", FieldKey = "LaborPrice", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "Price", FieldKey = "LaborPrice", TKeySection = "WorkOrderItemLabors" });
|
||||||
//DUPLICATE OF ABOVE l.Add(new FormField { TKey = "Tax", FieldKey = "LaborTaxName", TKeySection = "WorkOrderItemLabors" });
|
|
||||||
l.Add(new FormField { TKey = "TaxCodeTaxA", FieldKey = "LaborTaxAPct", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "TaxCodeTaxA", FieldKey = "LaborTaxAPct", TKeySection = "WorkOrderItemLabors" });
|
||||||
l.Add(new FormField { TKey = "TaxCodeTaxB", FieldKey = "LaborTaxBPct", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "TaxCodeTaxB", FieldKey = "LaborTaxBPct", TKeySection = "WorkOrderItemLabors" });
|
||||||
l.Add(new FormField { TKey = "TaxCodeTaxOnTax", FieldKey = "LaborTaxOnTax", TKeySection = "WorkOrderItemLabors" });
|
l.Add(new FormField { TKey = "TaxCodeTaxOnTax", FieldKey = "LaborTaxOnTax", TKeySection = "WorkOrderItemLabors" });
|
||||||
|
|||||||
@@ -1543,6 +1543,7 @@ namespace AyaNova.Biz
|
|||||||
return null;
|
return null;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
await ExpenseBizActionsAsync(AyaEvent.Created, newObject, null, null);
|
||||||
// newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
|
// newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
|
||||||
// newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
|
// newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
|
||||||
await ct.WorkOrderItemExpense.AddAsync(newObject);
|
await ct.WorkOrderItemExpense.AddAsync(newObject);
|
||||||
@@ -1587,6 +1588,7 @@ namespace AyaNova.Biz
|
|||||||
// dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
|
// dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
|
||||||
await ExpenseValidateAsync(putObject, dbObject);
|
await ExpenseValidateAsync(putObject, dbObject);
|
||||||
if (HasErrors) return null;
|
if (HasErrors) return null;
|
||||||
|
await ExpenseBizActionsAsync(AyaEvent.Modified, putObject, dbObject, null);
|
||||||
ct.Replace(dbObject, putObject);
|
ct.Replace(dbObject, putObject);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1672,10 +1674,84 @@ namespace AyaNova.Biz
|
|||||||
{
|
{
|
||||||
if (o.UserId != null)
|
if (o.UserId != null)
|
||||||
o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync();
|
o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync();
|
||||||
if (o.ChargeTaxCodeId != null)
|
// if (o.ChargeTaxCodeId != null)
|
||||||
o.ChargeTaxCodeViz = await ct.TaxCode.AsNoTracking().Where(x => x.Id == o.ChargeTaxCodeId).Select(x => x.Name).FirstOrDefaultAsync();
|
// o.ChargeTaxCodeViz = await ct.TaxCode.AsNoTracking().Where(x => x.Id == o.ChargeTaxCodeId).Select(x => x.Name).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
//Calculate totals and taxes
|
||||||
|
o.TaxAViz = 0;
|
||||||
|
o.TaxBViz = 0;
|
||||||
|
|
||||||
|
if (o.TaxAPct != 0)
|
||||||
|
{
|
||||||
|
o.TaxAViz = o.ChargeAmount * (o.TaxAPct / 100);
|
||||||
|
}
|
||||||
|
if (o.TaxBPct != 0)
|
||||||
|
{
|
||||||
|
if (o.TaxOnTax)
|
||||||
|
{
|
||||||
|
o.TaxBViz = (o.ChargeAmount + o.TaxAViz) * (o.TaxBPct / 100);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o.TaxBViz = o.ChargeAmount * (o.TaxBPct / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
o.LineTotalViz = o.ChargeAmount + o.TaxAViz + o.TaxBViz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//BIZ ACTIONS
|
||||||
|
//
|
||||||
|
//
|
||||||
|
private async Task ExpenseBizActionsAsync(AyaEvent ayaEvent, WorkOrderItemExpense newObj, WorkOrderItemExpense oldObj, IDbContextTransaction transaction)
|
||||||
|
{
|
||||||
|
//automatic actions on record change, called AFTER validation
|
||||||
|
|
||||||
|
//currently no processing required except for created or modified at this time
|
||||||
|
if (ayaEvent != AyaEvent.Created && ayaEvent != AyaEvent.Modified)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//SET TAXES AND PRICING
|
||||||
|
|
||||||
|
//by default apply all automatic actions with further restrictions possible below
|
||||||
|
bool ApplyTax = true;
|
||||||
|
|
||||||
|
|
||||||
|
//if modifed, see what has changed and should be re-applied
|
||||||
|
if (ayaEvent == AyaEvent.Modified)
|
||||||
|
{
|
||||||
|
|
||||||
|
//If taxes haven't change then no need to update taxes
|
||||||
|
if (newObj.ChargeTaxCodeId == oldObj.ChargeTaxCodeId)
|
||||||
|
ApplyTax = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Tax code
|
||||||
|
if (ApplyTax)
|
||||||
|
{
|
||||||
|
//Default in case nothing to apply
|
||||||
|
newObj.TaxAPct = 0;
|
||||||
|
newObj.TaxBPct = 0;
|
||||||
|
newObj.TaxOnTax = false;
|
||||||
|
newObj.TaxName = "";
|
||||||
|
|
||||||
|
if (newObj.ChargeTaxCodeId != null)
|
||||||
|
{
|
||||||
|
var t = await ct.TaxCode.AsNoTracking().FirstOrDefaultAsync(z => z.Id == newObj.ChargeTaxCodeId);
|
||||||
|
if (t != null)
|
||||||
|
{
|
||||||
|
newObj.TaxAPct = t.TaxAPct;
|
||||||
|
newObj.TaxBPct = t.TaxBPct;
|
||||||
|
newObj.TaxOnTax = t.TaxOnTax;
|
||||||
|
newObj.TaxName = t.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//VALIDATION
|
//VALIDATION
|
||||||
//
|
//
|
||||||
@@ -1940,8 +2016,6 @@ namespace AyaNova.Biz
|
|||||||
o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync();
|
o.UserViz = await ct.User.AsNoTracking().Where(x => x.Id == o.UserId).Select(x => x.Name).FirstOrDefaultAsync();
|
||||||
if (o.ServiceRateId != null)
|
if (o.ServiceRateId != null)
|
||||||
o.ServiceRateViz = await ct.ServiceRate.AsNoTracking().Where(x => x.Id == o.ServiceRateId).Select(x => x.Name).FirstOrDefaultAsync();
|
o.ServiceRateViz = await ct.ServiceRate.AsNoTracking().Where(x => x.Id == o.ServiceRateId).Select(x => x.Name).FirstOrDefaultAsync();
|
||||||
if (o.TaxCodeSaleId != null)
|
|
||||||
o.TaxCodeSaleViz = await ct.TaxCode.AsNoTracking().Where(x => x.Id == o.TaxCodeSaleId).Select(x => x.Name).FirstOrDefaultAsync();
|
|
||||||
|
|
||||||
//Calculate totals and taxes
|
//Calculate totals and taxes
|
||||||
o.TaxAViz = 0;
|
o.TaxAViz = 0;
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ namespace AyaNova.Models
|
|||||||
[Required]
|
[Required]
|
||||||
public decimal TaxPaid { get; set; }
|
public decimal TaxPaid { get; set; }
|
||||||
public long? ChargeTaxCodeId { get; set; }
|
public long? ChargeTaxCodeId { get; set; }
|
||||||
[NotMapped]
|
|
||||||
public string ChargeTaxCodeViz { get; set; }
|
|
||||||
public bool ReimburseUser { get; set; } = false;
|
public bool ReimburseUser { get; set; } = false;
|
||||||
public long? UserId { get; set; }
|
public long? UserId { get; set; }
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
@@ -29,6 +28,22 @@ namespace AyaNova.Models
|
|||||||
public bool ChargeToCustomer { get; set; } = false;
|
public bool ChargeToCustomer { get; set; } = false;
|
||||||
|
|
||||||
|
|
||||||
|
//TAX AND TOTAL FIELDS
|
||||||
|
public string TaxName { get; set; }
|
||||||
|
[Required]
|
||||||
|
public decimal TaxAPct { get; set; }
|
||||||
|
[Required]
|
||||||
|
public decimal TaxBPct { get; set; }
|
||||||
|
[Required]
|
||||||
|
public bool TaxOnTax { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal TaxAViz { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal TaxBViz { get; set; }
|
||||||
|
[NotMapped]
|
||||||
|
public decimal LineTotalViz { get; set; }
|
||||||
|
|
||||||
|
|
||||||
//UTILITY FIELDS
|
//UTILITY FIELDS
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public bool IsDirty { get; set; } = false;//never dirty coming from the server
|
public bool IsDirty { get; set; } = false;//never dirty coming from the server
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ namespace AyaNova.Models
|
|||||||
public decimal NoChargeQuantity { get; set; }
|
public decimal NoChargeQuantity { get; set; }
|
||||||
public long? ServiceBankId { get; set; }
|
public long? ServiceBankId { get; set; }
|
||||||
public long? TaxCodeSaleId { get; set; }
|
public long? TaxCodeSaleId { get; set; }
|
||||||
[NotMapped]
|
|
||||||
public string TaxCodeSaleViz { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -22,16 +22,16 @@ namespace AyaNova.Util
|
|||||||
//!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!!
|
//!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!!
|
||||||
private const int DESIRED_SCHEMA_LEVEL = 1;
|
private const int DESIRED_SCHEMA_LEVEL = 1;
|
||||||
|
|
||||||
internal const long EXPECTED_COLUMN_COUNT = 951;
|
internal const long EXPECTED_COLUMN_COUNT = 955;
|
||||||
internal const long EXPECTED_INDEX_COUNT = 141;
|
internal const long EXPECTED_INDEX_COUNT = 141;
|
||||||
internal const long EXPECTED_CHECK_CONSTRAINTS = 441;
|
internal const long EXPECTED_CHECK_CONSTRAINTS = 444;
|
||||||
internal const long EXPECTED_FOREIGN_KEY_CONSTRAINTS = 115;
|
internal const long EXPECTED_FOREIGN_KEY_CONSTRAINTS = 115;
|
||||||
internal const long EXPECTED_VIEWS = 6;
|
internal const long EXPECTED_VIEWS = 6;
|
||||||
internal const long EXPECTED_ROUTINES = 2;
|
internal const long EXPECTED_ROUTINES = 2;
|
||||||
|
|
||||||
//!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!!
|
//!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!!
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////// C951:I141:CC441:FC115:V6:R2
|
///////////////////////////////////////////////////////////////// (C955:I141:CC444:FC115:V6:R2)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -778,7 +778,8 @@ $BODY$ LANGUAGE PLPGSQL STABLE");
|
|||||||
//WORKORDERITEM EXPENSE
|
//WORKORDERITEM EXPENSE
|
||||||
await ExecQueryAsync("CREATE TABLE aworkorderitemexpense (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), "
|
await ExecQueryAsync("CREATE TABLE aworkorderitemexpense (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), "
|
||||||
+ "description TEXT, name TEXT, totalcost DECIMAL(38,18) NOT NULL default 0, chargeamount DECIMAL(38,18) NOT NULL default 0, taxpaid DECIMAL(38,18) NOT NULL default 0, "
|
+ "description TEXT, name TEXT, totalcost DECIMAL(38,18) NOT NULL default 0, chargeamount DECIMAL(38,18) NOT NULL default 0, taxpaid DECIMAL(38,18) NOT NULL default 0, "
|
||||||
+ "chargetaxcodeid BIGINT REFERENCES ataxcode, reimburseuser BOOL NOT NULL, userid BIGINT REFERENCES auser, chargetocustomer BOOL NOT NULL"
|
+ "chargetaxcodeid BIGINT REFERENCES ataxcode ON DELETE SET NULL, reimburseuser BOOL NOT NULL, userid BIGINT REFERENCES auser, chargetocustomer BOOL NOT NULL, "
|
||||||
|
+ "taxapct DECIMAL(8,5) NOT NULL default 0, taxbpct DECIMAL(8,5) NOT NULL default 0, taxontax BOOL NOT NULL default false, taxname TEXT "
|
||||||
+ ")");
|
+ ")");
|
||||||
|
|
||||||
//WORKORDERITEM LABOR
|
//WORKORDERITEM LABOR
|
||||||
|
|||||||
Reference in New Issue
Block a user