732 lines
27 KiB
C#
732 lines
27 KiB
C#
using Model;
|
||
using NPOI.POIFS.Properties;
|
||
using NPOI.SS.Formula.Functions;
|
||
using System;
|
||
using System.Collections.Concurrent;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace BLL.APIService
|
||
{
|
||
public class SyncSESService
|
||
{
|
||
private const string GETAPIUrl = "https://reportserver.basf-ypc.net.cn:3033/api/query";
|
||
public static void GetSyncContractor()
|
||
{
|
||
//string file = System.Web.HttpContext.Current.Server.MapPath("~/ContractorData.txt");
|
||
//string result = System.IO.File.ReadAllText(file);
|
||
|
||
string username = "EpermitContractor_EFC";
|
||
string password = "nM3#yU5$pO8%aZ6";
|
||
//string postData = $"Username={username}&Password={password}";
|
||
string result = BLL.Common.HttpHelper.HttpGetRequest(GETAPIUrl, username, password);
|
||
//BLL.ErrLogInfo.WriteLog($"请求API Result={result}");
|
||
|
||
var data = JsonHelper.DeserializeJsonToObject<List<SES>>(result);
|
||
ConcurrentBag<FC_SESReport> fcSesList = new ConcurrentBag<FC_SESReport>();
|
||
string errorInfos = string.Empty;
|
||
string message=string.Empty;
|
||
string fo=string.Empty;
|
||
|
||
foreach (var item in data)
|
||
{
|
||
string errorInfo = string.Empty;
|
||
string sesNo = string.Empty;
|
||
FC_SESReport fcSesModel = new FC_SESReport();
|
||
if (!string.IsNullOrEmpty(item.sesNo))
|
||
{
|
||
fcSesModel.SES_No = item.sesNo;
|
||
sesNo = item.sesNo;
|
||
}
|
||
else
|
||
{
|
||
errorInfo += " [SES No.] cannot be empty!";
|
||
}
|
||
|
||
fcSesModel.Short_Descrption = item.shortDescrption;
|
||
|
||
if (item.startDate != null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.startDate);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.Start_Date = TimeValue(item.startDate);
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[Start Date]" + message;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [Start Date]" + message;
|
||
}
|
||
}
|
||
|
||
if (item.endDate != null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.endDate);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.End_Date = TimeValue(item.endDate);
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[End Date]" + message;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [End Date]" + message;
|
||
}
|
||
}
|
||
|
||
fcSesModel.Created_by = item.createdBy;
|
||
|
||
if (item.createdOn != null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.createdOn);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.Created_on = TimeValue(item.createdOn);
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[Created on]" + message;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [Created on]" + message;
|
||
}
|
||
}
|
||
|
||
if (item.tecoDate != null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.tecoDate);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.TECO_Date = TimeValue(item.tecoDate);
|
||
fcSesModel.TECO_Format = TimeValue(item.tecoDate);
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[TECO Date]" + message;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [TECO Date]" + message;
|
||
}
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(item.requisitioner))
|
||
{
|
||
string requisitioner = item.requisitioner;
|
||
string[] reman = requisitioner.Split('/');
|
||
if (reman.Count() == 2)
|
||
{
|
||
fcSesModel.Requisitioner = reman[0];
|
||
}
|
||
else
|
||
{
|
||
fcSesModel.Requisitioner = requisitioner;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fcSesModel.Requisitioner = "";
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(item.fo))
|
||
{
|
||
fcSesModel.FO = item.fo;
|
||
fo = fcSesModel.FO;
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[FO] cannot be empty!";
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(item.item))
|
||
{
|
||
try
|
||
{
|
||
if (IsWholeNumber(item.item))
|
||
{
|
||
fcSesModel.Item = int.Parse(item.item);
|
||
}
|
||
else
|
||
{
|
||
errorInfo += " [Item]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += "[Item]Must be in numeric format!";
|
||
}
|
||
}
|
||
|
||
fcSesModel.Vendor_Name = item.vendorName;
|
||
|
||
if (item.ssrBudget!=null)
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.ssrBudget))
|
||
{
|
||
fcSesModel.SSR_budget = DecibelConversion(item.ssrBudget.Value.ToString().Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[SSR budget]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += "[SSR budget]Must be in numeric format!";
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fcSesModel.SSR_budget = 0;
|
||
}
|
||
|
||
fcSesModel.Currency = item.currency;
|
||
|
||
if (item.contractorQuotation!=null)
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.contractorQuotation))
|
||
{
|
||
fcSesModel.Contractor_quotation = DecibelConversion(item.contractorQuotation.Value.ToString().Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += " [Contractor quotation]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [Contractor quotation]Must be in numeric format!";
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fcSesModel.Contractor_quotation = 0;
|
||
}
|
||
|
||
if (item.ssrActualCost!=null)
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.ssrActualCost))
|
||
{
|
||
fcSesModel.SSR_Actual_cost = DecibelConversion(item.ssrActualCost.Value.ToString().Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[SSR Actual cost]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += "[SSR Actual cost]Must be in numeric format!";
|
||
}
|
||
}
|
||
else
|
||
{
|
||
fcSesModel.SSR_Actual_cost = 0;
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(item.taxRate))
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.taxRate.Replace("%", "")))
|
||
{
|
||
fcSesModel.Tax_rate = DecibelConversion(item.taxRate.Replace("%", "").Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += "[Tax rate]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += "[Tax rate]Must be in numeric format!";
|
||
}
|
||
}
|
||
|
||
if (item.deduction!=null)
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.deduction))
|
||
{
|
||
fcSesModel.Deviation = DecibelConversion(item.deduction.Value.ToString().Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[Deviation]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[Deviation]Must be in numeric format!";
|
||
}
|
||
}
|
||
|
||
//if (item.deductionPercentage!=null)
|
||
//{
|
||
// try
|
||
// {
|
||
// if (IsNumber(item.deductionPercentage))
|
||
// {
|
||
// fcSesModel.Deviation_Percentage = DecibelConversion(item.deductionPercentage.ToString().Trim());
|
||
// }
|
||
// else
|
||
// {
|
||
// errorInfos += (i + 2) + "line[Deviation Percentage]Must be in numeric format</br>";
|
||
// }
|
||
// }
|
||
// catch (Exception)
|
||
// {
|
||
// errorInfos += (i + 2) + "line[Deviation Percentage]Must be in numeric format</br>";
|
||
// }
|
||
//}
|
||
|
||
fcSesModel.Long_text = item.longText;
|
||
if (!string.IsNullOrEmpty(item.workOrder))
|
||
{
|
||
try
|
||
{
|
||
if (IsWholeNumber(item.workOrder))
|
||
{
|
||
fcSesModel.Work_Order = int.Parse(item.workOrder.Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[Work Order]Must be in pure number format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[Work Order]Must be in pure number format!";
|
||
}
|
||
}
|
||
fcSesModel.Function_location = item.functionLocation;
|
||
fcSesModel.Main_work_center = item.mainWorkCenter;
|
||
|
||
if (!string.IsNullOrEmpty(item.workCenter))
|
||
{
|
||
fcSesModel.Work_Center = item.workCenter.ToString();
|
||
|
||
if (fcSesModel.Work_Center.Contains("CTM/L"))
|
||
{
|
||
fcSesModel.Dep = "CTM";
|
||
fcSesModel.Section = "CTM/P";
|
||
}
|
||
else if (fcSesModel.Work_Center.Length > 5 && (fcSesModel.Work_Center.ToString() == "CTA/LV" || fcSesModel.Work_Center.ToString() == "CTA/LW"))
|
||
{
|
||
fcSesModel.Dep = "CTA";
|
||
fcSesModel.Section = "CTA/L";
|
||
}
|
||
else if (fcSesModel.Work_Center.Length > 5 && fcSesModel.Work_Center.Substring(0, 5) == "CTA/L" && (fcSesModel.Work_Center.ToString() != "CTA/LV" || fcSesModel.Work_Center.ToString() != "CTA/LW"))
|
||
{
|
||
fcSesModel.Section = "CTA/P";
|
||
}
|
||
else if (fcSesModel.Work_Center.Length >= 5)
|
||
{
|
||
fcSesModel.Dep = fcSesModel.Work_Center.Substring(0, 3);
|
||
fcSesModel.Section = fcSesModel.Work_Center.Substring(0, 5);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!string.IsNullOrEmpty(item.wbs))
|
||
{
|
||
fcSesModel.Section = "PS";
|
||
}
|
||
}
|
||
|
||
fcSesModel.Cost_center = item.costCenter;
|
||
fcSesModel.WBS = item.wbs;
|
||
fcSesModel.Network = item.network;
|
||
|
||
if (item.claimSheetsReceive!=null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.claimSheetsReceive);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.Claim_sheets_receive = TimeValue(item.claimSheetsReceive);
|
||
fcSesModel.CS_REC_Format = TimeValue(item.claimSheetsReceive);
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[Claim sheets receive]" + message + "!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[Claim sheets receive]" + message + "!";
|
||
}
|
||
}
|
||
|
||
if (item.engineerConfirmedO!=null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.engineerConfirmedO);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.Engineer_confirmed_o = TimeValue(item.engineerConfirmedO);
|
||
fcSesModel.ENG_CONF_Format = TimeValue(item.engineerConfirmedO);
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[Engineer confirmed o]" + message + "!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[Engineer confirmed o]" + message + "!";
|
||
}
|
||
}
|
||
|
||
if (item.sesConfirmedOn!=null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.sesConfirmedOn);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.SES_Confirmed_on = TimeValue(item.sesConfirmedOn);
|
||
fcSesModel.SES_CONF_Format = TimeValue(item.sesConfirmedOn);
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[SES Confirmed on]" + message + "!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[SES Confirmed on]" + message + "!";
|
||
}
|
||
}
|
||
// 以下没有
|
||
// Contractor_duration
|
||
// BoQ_confirmation_dur
|
||
// Settlement duration
|
||
// Invoiced on
|
||
//Invoice duration
|
||
// Payment made on
|
||
//Payment duration
|
||
|
||
fcSesModel.Accepted = item.Accepted;
|
||
fcSesModel.Deleted = item.deleted;
|
||
fcSesModel.Blocked = item.blocked;
|
||
fcSesModel.Changed_by = item.changedDy;
|
||
fcSesModel.DateIn= DateTime.Now;
|
||
|
||
// 以下和诚实度和及时性有关
|
||
fcSesModel.CPT_No = item.cptNo;
|
||
if (!string.IsNullOrEmpty(item.con))
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.con))
|
||
{
|
||
fcSesModel.Con_Days = DecibelConversion(item.con.Trim());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += " [con]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [con]Must be in numeric format!";
|
||
}
|
||
}
|
||
|
||
if (item.submiteDate != null)
|
||
{
|
||
try
|
||
{
|
||
message = TimeValidation(item.submiteDate);
|
||
if (string.IsNullOrEmpty(message))
|
||
{
|
||
fcSesModel.Submit_Date = TimeValue(item.submiteDate);
|
||
}
|
||
else
|
||
{
|
||
errorInfos += "[submiteDate]" + message + "!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfos += "[submiteDate]" + message + "!";
|
||
}
|
||
}
|
||
if (item.contractorQuotation!=null)
|
||
{
|
||
try
|
||
{
|
||
if (IsNumber(item.contractorQuotation))
|
||
{
|
||
fcSesModel.Quotation = DecibelConversion(item.contractorQuotation.Value.ToString());
|
||
}
|
||
else
|
||
{
|
||
errorInfo += " [contractorQuotation]Must be in numeric format!";
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
errorInfo += " [contractorQuotation]Must be in numeric format!";
|
||
}
|
||
}
|
||
|
||
if (item.ssrActualCost != null && item.contractorQuotation != null)
|
||
{
|
||
decimal punishment = 0;
|
||
var pun = from x in Funs.DB.EMC_Punishment where x.SES_No == item.sesNo select x;
|
||
if (pun.Count() > 0)
|
||
{
|
||
punishment = pun.Sum(x => x.Company != null ? x.Company.Value : 0) + pun.Sum(x => x.Individual != null ? x.Individual.Value : 0);
|
||
}
|
||
|
||
decimal tax_Value = decimal.Parse((item.ssrActualCost.Value * (1 + fcSesModel.Tax_rate)).Value.ToString("0.00"));
|
||
fcSesModel.Deduction = decimal.Parse((item.contractorQuotation.Value - tax_Value - punishment).ToString("0.00"));
|
||
}
|
||
|
||
|
||
if (errorInfo != string.Empty)
|
||
{
|
||
errorInfos += errorInfo;
|
||
}
|
||
else
|
||
{
|
||
fcSesList.Add(fcSesModel);
|
||
}
|
||
}
|
||
AddSyncSES(fcSesList);
|
||
}
|
||
|
||
private static void AddSyncSES(ConcurrentBag<FC_SESReport> sesList)
|
||
{
|
||
SQLHelper.ExecutSql("truncate table FC_SESReport");
|
||
var result = SqlBulkHelper.BulkInsert(SqlBulkHelper.GetCon(), "FC_SESReport", sesList.ToList());
|
||
|
||
}
|
||
|
||
#region 格式验证
|
||
/// <summary>
|
||
/// 时间格式验证
|
||
/// </summary>
|
||
/// <param name="time"></param>
|
||
/// <returns></returns>
|
||
private static string TimeValidation(object time)
|
||
{
|
||
string message = string.Empty;
|
||
try
|
||
{
|
||
if (time.ToString().Contains("."))
|
||
{
|
||
DateTime.ParseExact(time.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture);
|
||
}
|
||
else
|
||
{
|
||
Convert.ToDateTime(time);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
message = "Please enter a valid time format!";
|
||
}
|
||
return message;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 带小数的数字验证
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
public static bool IsNumber(object input)
|
||
{
|
||
string pattern = "^-?\\d+$|^(-?\\d+)(\\.\\d+)?$";
|
||
Regex regex = new Regex(pattern);
|
||
string value = input != null ? DecibelConversion(input.ToString()).ToString() : "";
|
||
return regex.IsMatch(value.Trim());
|
||
}
|
||
|
||
/// <summary>
|
||
/// 整数
|
||
/// </summary>
|
||
/// <param name="strNumber"></param>
|
||
/// <returns></returns>
|
||
public static bool IsWholeNumber(object input)
|
||
{
|
||
Regex g = new Regex(@"^[-]?[0-9]\d*$");
|
||
string value = input != null ? input.ToString() : "";
|
||
return g.IsMatch(value);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 千分位转换
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
public static decimal DecibelConversion(string input)
|
||
{
|
||
var inputValue = string.Empty;
|
||
if (input.Contains(',') && input.Contains('.'))
|
||
{
|
||
var inputstr = input.Replace(".", "").Split(',');
|
||
if (inputstr.Length > 0)
|
||
{
|
||
for (int i = 0; i < inputstr.Length; i++)
|
||
{
|
||
inputValue += i < (inputstr.Length - 1) ? inputstr[i] : "." + inputstr[i];
|
||
}
|
||
}
|
||
}
|
||
else if (input.Contains(','))
|
||
{
|
||
inputValue = input.Replace(",", ".");
|
||
}
|
||
else
|
||
{
|
||
inputValue = input;
|
||
}
|
||
inputValue = inputValue.Length > 18 ? inputValue.Substring(0, 17) : inputValue;
|
||
return decimal.Parse(inputValue);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 时间格式转换
|
||
/// </summary>
|
||
/// <param name="value"></param>
|
||
/// <returns></returns>
|
||
public static DateTime TimeValue(object value)
|
||
{
|
||
string dateValue = string.Empty;
|
||
if (value != null)
|
||
{
|
||
if (value.ToString().Contains("."))
|
||
{
|
||
dateValue = DateTime.ParseExact(value.ToString(), "dd.MM.yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd");
|
||
}
|
||
else
|
||
{
|
||
dateValue = DateTime.Parse(value.ToString()).ToString("yyyy-MM-dd");
|
||
}
|
||
}
|
||
return DateTime.Parse(dateValue);
|
||
}
|
||
#endregion
|
||
|
||
}
|
||
|
||
#region 内部类
|
||
[Serializable]
|
||
internal class SES
|
||
{
|
||
public string Accepted { get; set; }
|
||
public string blocked { get; set; }
|
||
public DateTime? startDate { get; set; }
|
||
public DateTime? endDate { get; set; }
|
||
public string createdBy { get; set; }
|
||
public DateTime? tecoDate { get; set; }
|
||
public string sesNo { get; set; }
|
||
public string deleted { get; set; }
|
||
public string workOrder { get; set; }
|
||
public string OpSopNo { get; set; }
|
||
public string prItem { get; set; }
|
||
public string prNumber { get; set; }
|
||
public string shortDescrption { get; set; }
|
||
public string fo { get; set; }
|
||
public string item { get; set; }
|
||
public string vendorName { get; set; }
|
||
public decimal? ssrBudget { get; set; }
|
||
public decimal? contractorQuotation { get; set; }
|
||
public decimal? ssrActualCost { get; set; }
|
||
public decimal? ssrActualCostNetAmount { get; set; }
|
||
public string wbs { get; set; }
|
||
public DateTime? createdOn { get; set; }
|
||
public DateTime? claimSheetsReceive { get; set; }
|
||
public decimal? sesConfirmedOn { get; set; }
|
||
public string requisitioner { get; set; }
|
||
public string currency { get; set; }
|
||
public string reducedByQuantity { get; set; }
|
||
public string userField { get; set; }
|
||
public string taxRate { get; set; }
|
||
|
||
public string changedDy { get; set; }
|
||
public string longText { get; set; }
|
||
public string functionLocation { get; set; }
|
||
public string mainWorkCenter { get; set; }
|
||
public string workCenter { get; set; }
|
||
public string costCenter { get; set; }
|
||
public string network { get; set; }
|
||
public decimal? deduction { get; set; }
|
||
public string deductionPercentage { get; set; }
|
||
public string con { get; set; }
|
||
public DateTime? submiteDate { get; set; }
|
||
public DateTime? updateTime { get; set; }
|
||
public string cptNo { get; set; }
|
||
public string revision { get; set; }
|
||
public string tarItem { get; set; }
|
||
public string budgetBy { get; set; }
|
||
public string sesStatus { get; set; }
|
||
public string sesConfirm { get; set; }
|
||
public string visaResetCount { get; set; }
|
||
public string visaExceptionCount { get; set; }
|
||
public string settleExceptionCount { get; set; }
|
||
public string settleResetCount { get; set; }
|
||
public string finishDate { get; set; }
|
||
public string finishDateConfirm { get; set; }
|
||
public string finishDateVerify { get; set; }
|
||
public string isPack { get; set; }
|
||
public string checkMoney { get; set; }
|
||
|
||
public decimal? amountDeclared { get; set; }
|
||
public decimal? priceFirstValue { get; set; }
|
||
public decimal? approvedValue { get; set; }
|
||
public decimal? entrustValue { get; set; }
|
||
public decimal? overdueDeductions { get; set; }
|
||
public decimal? safetyAssDeduc { get; set; }
|
||
|
||
public string settleApprovedType { get; set; }
|
||
public string externalNo { get; set; }
|
||
public decimal? cptEndTime { get; set; }
|
||
public string engineerConfirmedO { get; set; }
|
||
public string settleClaimSheetsReceive { get; set; }
|
||
public string section { get; set; }
|
||
public string deviation { get; set; }
|
||
public string deviationPercentage { get; set; }
|
||
public string LastPayment { get; set; }
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
}
|