WIP ARMS integration.

This commit is contained in:
Patrick Fic
2022-02-01 12:51:59 -08:00
parent 91af972f01
commit 405da503ec
4 changed files with 708 additions and 0 deletions

View File

@@ -168,6 +168,7 @@
</Compile>
<Compile Include="Utils\ApplicationExceptionHandler.cs" />
<Compile Include="Utils\AppMetaData.cs" />
<Compile Include="Utils\ARMSRoDataModel.cs" />
<Compile Include="Utils\Auth.cs" />
<Compile Include="Utils\BaseModel.cs" />
<Compile Include="Utils\BaseViewModel.cs" />
@@ -195,6 +196,7 @@
<Compile Include="Utils\Queries\VehicleQueries.cs" />
<Compile Include="Utils\QuickBooksInterop.cs" />
<Compile Include="Utils\RelayCommand.cs" />
<Compile Include="Utils\ARMSRoData.cs" />
<Compile Include="Utils\SquirrelAwareHelper.cs" />
<Compile Include="Utils\TrayIcon.cs" />
<Compile Include="Utils\UiConverters.cs" />
@@ -346,6 +348,9 @@
<PackageReference Include="DotNetDBF">
<Version>6.0.0.3</Version>
</PackageReference>
<PackageReference Include="FileHelpers">
<Version>3.5.1</Version>
</PackageReference>
<PackageReference Include="FirebaseAuthentication.net">
<Version>3.7.2</Version>
</PackageReference>

View File

@@ -0,0 +1,240 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using FileHelpers;
using GraphQL;
namespace BodyshopPartner.Utils
{
public static class ARMSRoData
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static string ArmsRoDataQuery = @"
query ENTEGRAL_EXPORT($bodyshopid: uuid!, $start: timestamptz!, $end: timestamptz!) {
jobs(where: {_and: [{_or: [{inproduction: {_eq: true}}, {_and: [{actual_completion: {_gte: $start}}, {actual_completion: {_lte: $end}}]}]}, {shopid: {_eq: $bodyshopid}}]}) {
joblines {
id
line_ind
}
id
ro_number
status
asgn_date
date_open
kmin
scheduled_completion
actual_completion
actual_delivery
date_exported
ins_co_nm
ins_addr1
ins_addr2
ins_city
ins_st
ins_zip
ins_ctry
ins_ph1
ins_ph2
est_ct_ln
est_ct_fn
insd_fn
insd_ln
ownr_fn
ownr_ln
ownr_co_nm
ownr_addr1
ownr_addr2
ownr_city
ownr_st
ownr_zip
ownr_ctry
ownr_ph1
ownr_ph2
ownr_ea
clm_ct_fn
clm_ct_ln
v_vin
kmin
plate_no
v_model_yr
v_make_desc
v_model_desc
v_color
driveable
clm_no
policy_no
loss_date
area_of_damage
tlos_ind
parts_tax_rates
federal_tax_rate
state_tax_rate
rate_la1
rate_la2
rate_la3
rate_la4
rate_laa
rate_lab
rate_lad
rate_lae
rate_laf
rate_lag
rate_lam
rate_lar
rate_las
rate_lau
rate_ma2s
rate_ma2t
rate_ma3s
rate_mabl
rate_macs
rate_mahw
rate_mapa
rate_mash
rate_matd
job_totals
ded_amt
cieca_ttl
adjustment_bottom_line
employee_body_rel {
employee_number
first_name
last_name
}
employee_refinish_rel {
employee_number
first_name
last_name
}
}
bodyshops_by_pk(id: $bodyshopid) {
id
entegral_id
shopname
md_ro_statuses
}
}
";
public static async Task GenerateArmsROData()
{
logger.Debug("Generating ARMS Info.");
try
{
FileHelperEngine<ARMSRoDataModel> engine = new FileHelperEngine<ARMSRoDataModel>();
var r = new GraphQLRequest
{
Query = ArmsRoDataQuery,
Variables = new
{
start = DateTime.Now.Date.AddDays(-30),
end = DateTime.Now.Date,
bodyshopid = AppMetaData.ActiveShopId
}
};
var data = await Utils.GraphQL.ExecuteQuery(r);
var RepairOrders = new List<ARMSRoDataModel>();
Regex ROStripper = new Regex(@"\d");
foreach (dynamic job in data.jobs)
{
var RoNumber = string.Join("", Regex.Matches((string)(job.ro_number?.Value), @"\d").OfType<Match>().Select(m => m.Value));
logger.Debug(RoNumber);
RepairOrders.Add(new ARMSRoDataModel()
{
ShopShortName = int.Parse(data.bodyshops_by_pk.entegral_id?.Value),
RO = int.Parse(RoNumber),
TransType = "Z", //TODO*** Finish this status mapping.
ShopLongName = data.bodyshops_by_pk.shopname?.Value,
EstimatorID = job.est_ct_ln,
EstimatorName = $"{job.est_ct_fn} {job.est_ct_ln}",
BodymanID = job.employee_body_rel?.Value == null ? "" : job.employee_body_rel?.employee_number?.Value,
CustomerFirstName = job.ownr_fn?.Value,
CustomerLastName = job.ownr_ln?.Value,
CustomerStreet = job.ownr_addr1?.Value,
CustomerCity = job.ownr_city?.Value,
CustomerState = job.ownr_st?.Value,
CustomerZip = job.ownr_ph1?.Value,
RetWhslCustomer = "R",
Year = int.Parse(job.v_model_yr?.Value ?? 0), //TODO STRIP TO 2 NUMBERS
Make = job.v_make_desc?.Value,
Model = job.v_model_desc?.Value,
VIN = job.v_vin?.Value,
License = job.plate_no?.Value,
MileageIn = job.kim ?? 0,
CompanyName = job.ins_co_nm?.Value,
InsuranceAddress = job.ins_addr1?.Value,
InsuranceCity = job.ins_city?.Value,
InsuranceState = job.ins_st?.Value,
InsuranceZip = job.ins_zip?.Value,
ClaimType = "N/A",
Claim = job.clm_no?.Value,
DateOpened = job.date_open?.Value,// ? job.date_open : null,
//DateofLoss = job.loss_date?.Value,// ? job.loss_date : null,
PromiseDate = job.scheduled_completion,
CustPickup = job.actual_delivery,
DateClosed = job.date_invoiced,
BodyRate = job.rate_lab,
RefinishRate = job.rate_lar,
MechanicalRate = job.rate_lam,
StructuralRate = job.rate_las,
PMRate = job.rate_mapa,
BMRate = job.rate_mash,
RevisedTotalsBodyHours = job.job_totals?.rates?.lab?.hours?.Value,
RevisedTotalsRefinishHours = job.job_totals?.rates?.lar?.hours?.Value,
RevisedTotalsMechanicalHours = job.job_totals?.rates?.lam?.hours?.Value,
RevisedTotalsStructuralHours = job.job_totals?.rates?.las?.hours?.Value,
RevisedTotalsPartsTotal = job.job_totals?.pars?.parts?.total?.amount?.Value/100,
RevisedTotalsSubletTotal = job.job_totals?.pars?.sublets?.total?.amount?.Value / 100,
RevisedTotalsBodyLaborTotal = job.job_totals?.rates?.lab?.total?.amount?.Value/100,
RevisedTotalsRefinishLaborTotal = job.job_totals?.rates?.lar?.total?.amount?.Value / 100,
RevisedTotalsMechanicalLaborTotal = job.job_totals?.rates?.lam?.total?.amount?.Value / 100,
RevisedTotalsStructuralLaborTotal = job.job_totals?.rates?.las?.total?.amount?.Value / 100,
RevisedTotalsPMTotal = job.job_totals?.rates?.mapa?.total?.amount?.Value / 100,
RevisedTotalsBMTotal = job.job_totals?.rates?.mash?.total?.amount?.Value / 100,
RevisedTotalsSalesTaxTotal = (job.job_totals?.totals?.federal_tax?.amount?.Value + job.job_totals?.totals?.state_tax?.amount?.Value) /100,
RevisedTotalsGrossTotal = job.job_totals?.totals?.total_repairs?.amount?.Value /100,
RevisedTotalsDeductibleTotal = job.ded_amt?.Value,
// RevisedTotalsDepreciationTotal = job.job_totals?.rates?.lab?.hours?.Value,
TotalLossYN = job.tlos_ind,
BodyTechName = job.employee_body_rel?.Value == null ? "" : $"{job.employee_body_rel?.first_name?.Value} {job.employee_body_rel?.last_name?.Value}",
Vehiclecolor = job.v_color?.Value,
PaintTechID = job.employee_refinish_rel?.Value == null ? "" : job.employee_refinish_rel?.employee_number?.Value,
PaintTechName = job.employee_refinish_rel?.Value == null ? "" : $"{job.employee_refinish_rel?.first_name?.Value} {job.employee_refinish_rel?.last_name?.Value}",
ProductionStageCode = "33" //TODO ADD THE REST OF THE CODE
});
}
engine.WriteFile("Output.Txt", RepairOrders);
}
catch (Exception ex)
{
logger.Error(ex, "Exception while creating ARMS RO Data Extract: ");
}
}
}
}

View File

@@ -0,0 +1,445 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FileHelpers;
namespace BodyshopPartner.Utils
{
[FixedLengthRecord()]
public class ARMSRoDataModel
{
[FieldFixedLength(5)]
public int CustId;
[FieldFixedLength(30)]
[FieldTrim(TrimMode.Both)]
public string Name;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? AddedDate;
[FieldFixedLength(8)]
public int ShopShortName;
[FieldFixedLength(8)]
public int RO;
[FieldFixedLength(1)]
public String TransType;
[FieldFixedLength(35)]
public String ShopLongName;
[FieldFixedLength(5)]
public String EstimatorID;
[FieldFixedLength(35)]
public String EstimatorName;
[FieldFixedLength(5)]
public String BodymanID;
[FieldFixedLength(35)]
public String CustomerFirstName;
[FieldFixedLength(35)]
public String CustomerLastName;
[FieldFixedLength(40)]
public String CustomerStreet;
[FieldFixedLength(30)]
public String CustomerCity;
[FieldFixedLength(2)]
public String CustomerState;
[FieldFixedLength(11)]
public String CustomerZip;
[FieldFixedLength(10)]
public int CustomerPhone1;
[FieldFixedLength(10)]
public int CustomerPhone2;
[FieldFixedLength(35)]
public String CustomerSource;
[FieldFixedLength(1)]
public String RetWhslCustomer;
[FieldFixedLength(1)]
public String CatMFD;
[FieldFixedLength(2)]
public int Year;
[FieldFixedLength(20)]
public String Make;
[FieldFixedLength(50)]
public String Model;
[FieldFixedLength(25)]
public String VIN;
[FieldFixedLength(10)]
public String License;
[FieldFixedLength(6)]
public int MileageIn;
[FieldFixedLength(5)]
public String InsuranceCoCode;
[FieldFixedLength(35)]
public String CompanyName;
[FieldFixedLength(40)]
public String InsuranceAddress;
[FieldFixedLength(30)]
public String InsuranceCity;
[FieldFixedLength(2)]
public String InsuranceState;
[FieldFixedLength(11)]
public String InsuranceZip;
[FieldFixedLength(10)]
public int InsurancePhone;
[FieldFixedLength(10)]
public int InsuranceFax;
[FieldFixedLength(4)]
public String ClaimType;
[FieldFixedLength(1)]
public String LossType;
[FieldFixedLength(30)]
public String Policy;
[FieldFixedLength(30)]
public String Claim;
[FieldFixedLength(35)]
public String InsuredLastName;
[FieldFixedLength(35)]
public String InsuredFirstName;
[FieldFixedLength(35)]
public String ClaimantLastName;
[FieldFixedLength(35)]
public String ClaimantFirstName;
[FieldFixedLength(25)]
public String Assignment;
[FieldFixedLength(35)]
public String InsuranceAgentLastName;
[FieldFixedLength(35)]
public String InsuranceAgentFirstName;
[FieldFixedLength(10)]
public int InsAgentPhone;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? DateOpened;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? DateofLoss;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? AssignedDate;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? TeardownHold;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? CarinShop;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? EstComplete;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? PartsOrder;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? AsstoBody;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? AsstoMech;
[FieldFixedLength(8)]
public DateTime? AsstoPaint;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? AssntoDetail;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? CarComplete;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? PromiseDate;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? CustPickup;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? InsInspDate;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? DateClosed;
[FieldFixedLength(12)]
public Double? BodyRate;
[FieldFixedLength(12)]
public Double? RefinishRate;
[FieldFixedLength(12)]
public Double? MechanicalRate;
[FieldFixedLength(12)]
public Double? StructuralRate;
[FieldFixedLength(12)]
public Double? PMRate;
[FieldFixedLength(12)]
public Double? BMRate;
[FieldFixedLength(7)]
public Double? RetailWholesaleTaxRate;
[FieldFixedLength(12)]
public Double? StorageRateperDay;
[FieldFixedLength(3)]
public Double? DaysStored;
[FieldFixedLength(5)]
public Double? BodyHours;
[FieldFixedLength(5)]
public Double? RefinishHours;
[FieldFixedLength(5)]
public Double? MechanicalHours;
[FieldFixedLength(5)]
public Double? StructuralHours;
[FieldFixedLength(12)]
public Double? PartsTotal;
[FieldFixedLength(12)]
public Double? SubletTotal;
[FieldFixedLength(12)]
public Double? BodyLaborTotal;
[FieldFixedLength(12)]
public Double? RefinishLaborTotal;
[FieldFixedLength(12)]
public Double? MechanicalLaborTotal;
[FieldFixedLength(12)]
public Double? StructuralLaborTotal;
[FieldFixedLength(12)]
public Double? MiscellaneousChargeTotal;
[FieldFixedLength(12)]
public Double? PMTotal;
[FieldFixedLength(12)]
public Double? BMTotal;
[FieldFixedLength(12)]
public Double? MiscTotal;
[FieldFixedLength(12)]
public Double? TowingTotal;
[FieldFixedLength(12)]
public Double? StorageTotal;
[FieldFixedLength(12)]
public Double? DetailTotal;
[FieldFixedLength(12)]
public Double? SalesTaxTotal;
[FieldFixedLength(12)]
public Double? GrossTotal;
[FieldFixedLength(12)]
public Double? DeductibleTotal;
[FieldFixedLength(12)]
public Double? DepreciationTotal;
[FieldFixedLength(12)]
public Double? Discount;
[FieldFixedLength(12)]
public Double? CustomerPay;
[FieldFixedLength(12)]
public Double? InsurancePay;
[FieldFixedLength(12)]
public Double? Deposit;
[FieldFixedLength(12)]
public Double? AmountDue;
[FieldFixedLength(5)]
public Double? SupplementBodyHours;
[FieldFixedLength(5)]
public Double? SupplementRefinishHours;
[FieldFixedLength(5)]
public Double? SupplementMechanicalHours;
[FieldFixedLength(5)]
public Double? SupplementStructuralHours;
[FieldFixedLength(12)]
public Double? SupplementPartsTotal;
[FieldFixedLength(12)]
public Double? SupplementSubletTotal;
[FieldFixedLength(12)]
public Double? SupplementBodyLaborTotal;
[FieldFixedLength(12)]
public Double? SupplementRefinishLaborTotal;
[FieldFixedLength(12)]
public Double? SupplementMechanicalLaborTotal;
[FieldFixedLength(12)]
public Double? SupplementStructuralLaborTotal;
[FieldFixedLength(12)]
public Double? SupplementMiscellaneousChargeTotal;
[FieldFixedLength(12)]
public Double? SupplementPMTotal;
[FieldFixedLength(12)]
public Double? SupplementBMTotal;
[FieldFixedLength(12)]
public Double? SupplementMiscTotal;
[FieldFixedLength(12)]
public Double? SupplementTowingTotal;
[FieldFixedLength(12)]
public Double? SupplementStorageTotal;
[FieldFixedLength(12)]
public Double? SupplementDetailTotal;
[FieldFixedLength(12)]
public Double? SupplementSalesTaxTotal;
[FieldFixedLength(12)]
public Double? SupplementGrossTotal;
[FieldFixedLength(12)]
public Double? SupplementDeductibleTotal;
[FieldFixedLength(12)]
public Double? SupplementDepreciationTotal;
[FieldFixedLength(12)]
public Double? SupplementDiscount;
[FieldFixedLength(12)]
public Double? SupplementCustomerPay;
[FieldFixedLength(12)]
public Double? SupplementInsurancePay;
[FieldFixedLength(12)]
public Double? SupplementDeposit;
[FieldFixedLength(12)]
public Double? SupplementAmountDue;
[FieldFixedLength(5)]
public Double? RevisedTotalsBodyHours;
[FieldFixedLength(5)]
public Double? RevisedTotalsRefinishHours;
[FieldFixedLength(5)]
public Double? RevisedTotalsMechanicalHours;
[FieldFixedLength(5)]
public Double? RevisedTotalsStructuralHours;
[FieldFixedLength(12)]
public Double? RevisedTotalsPartsTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsSubletTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsBodyLaborTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsRefinishLaborTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsMechanicalLaborTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsStructuralLaborTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsMiscellaneousChargeTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsPMTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsBMTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsMiscTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsTowingTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsStorageTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsDetailTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsSalesTaxTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsGrossTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsDeductibleTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsDepreciationTotal;
[FieldFixedLength(12)]
public Double? RevisedTotalsDiscount;
[FieldFixedLength(12)]
public Double? RevisedTotalsCustomerPay;
[FieldFixedLength(12)]
public Double? RevisedTotalsInsurancePay;
[FieldFixedLength(12)]
public Double? RevisedTotalsDeposit;
[FieldFixedLength(12)]
public Double? RevisedTotalsAmountDue;
[FieldFixedLength(2)]
public int ProductionStatus;
[FieldFixedLength(20)]
public String StatusDescription;
[FieldFixedLength(20)]
public String Hub50Comment;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? Dateofchange;
[FieldFixedLength(20)]
public String BodyTechName;
[FieldFixedLength(1)]
public String TotalLossYN;
[FieldFixedLength(50)]
public String InScreenCommentsLine1;
[FieldFixedLength(50)]
public String InScreenCommentsLine2;
[FieldFixedLength(4)]
public int CustomerPhone2Extension;
[FieldFixedLength(10)]
public int CustomerPhone3;
[FieldFixedLength(4)]
public int CustomerPhone3Extension;
[FieldFixedLength(60)]
public String CustomerFileComments;
[FieldFixedLength(10)]
public String Vehiclecolor;
[FieldFixedLength(4)]
public int VehicleProductionDate;
[FieldFixedLength(10)]
public String VehiclePaintCode;
[FieldFixedLength(10)]
public String VehicleTrimCode;
[FieldFixedLength(10)]
public String VehicleBodyStyle;
[FieldFixedLength(25)]
public String InsideAdjuster;
[FieldFixedLength(25)]
public String OutsideAdjuster;
[FieldFixedLength(20)]
public String AssignmentCaller;
[FieldFixedLength(10)]
public String AssignmentDivision;
[FieldFixedLength(1)]
public String InsuredorClaimantFlag;
[FieldFixedLength(20)]
public String LocationofPrimaryImpact;
[FieldFixedLength(20)]
public String LocationofSecondaryImpact;
[FieldFixedLength(1)]
public String DrivableFlag;
[FieldFixedLength(5)]
public String PaintTechID;
[FieldFixedLength(35)]
public String PaintTechName;
[FieldFixedLength(80)]
public String CustomerEmail;
[FieldFixedLength(12)]
public Double? GSTTax;
[FieldFixedLength(3)]
public String RepairDelayStatusCode;
[FieldFixedLength(80)]
public String RepairDelaycomment;
[FieldFixedLength(3)]
public String ProductionStageCode;
[FieldFixedLength(80)]
public String ProductionStageComment;
[FieldFixedLength(8)]
[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
public DateTime? Vehiclescheduledindate;
[FieldFixedLength(20)]
public int AlternateRO;
}
}

View File

@@ -91,6 +91,19 @@ namespace BodyshopPartner.Utils
HandlePaintScaleExport(req, res); }
, "POST");
Route.Add("/arms/rodata/", (req, res, props) =>
{
hlog("Received an ARMS RO DAta Export Request");
res.WithCORS();
res.Close();
}, "OPTIONS");
Route.Add("/arms/rodata/",
(req, res, props) => {
hlog("Received an ARMS RO DAta Export Request");
HandleArmsRODataExtract(req, res);
}
, "POST");
logger.Trace("Starting HTTP server...");
hlog = HttpLogger;
try
@@ -314,5 +327,10 @@ namespace BodyshopPartner.Utils
await Utils.PPGMixData.PushDataToPPG();
res.WithCORS().AsText("OK");
}
private static async void HandleArmsRODataExtract(System.Net.HttpListenerRequest req, System.Net.HttpListenerResponse res)
{
await Utils.ARMSRoData.GenerateArmsROData();
res.WithCORS().AsText("OK");
}
}
}