|
@@ -24,6 +24,7 @@ namespace TCCInvoice
|
|
|
private int freeTaxSalesAmount = FREE_ZERO_TAX_SALES_AMOUNT;
|
|
|
private int zeroTaxSalesAmount = FREE_ZERO_TAX_SALES_AMOUNT;
|
|
|
private string invoiceType = INVOICE_TYPE;
|
|
|
+ private string randomNumber;
|
|
|
private int taxType = TAX_TYPE;
|
|
|
private double taxRate = TAX_RATE;
|
|
|
private int taxAmount;
|
|
@@ -40,7 +41,13 @@ namespace TCCInvoice
|
|
|
private string contactPhone;
|
|
|
private List<InvoiceItem> invoiceItems = new List<InvoiceItem>();
|
|
|
|
|
|
- private FileSystemWatcher xmlWatcher;
|
|
|
+ private FileSystemWatcher preInvoiceResponseWatcher;
|
|
|
+ private FileSystemWatcher sellerInvoiceResponseWatcher;
|
|
|
+ private string responseInvoiceNumber;
|
|
|
+ private string responseDataNumber;
|
|
|
+ private string responseInvoiceDate;
|
|
|
+ private string responseInvoiceTime;
|
|
|
+ private string responseInvoiceError;
|
|
|
#endregion
|
|
|
|
|
|
#region Constants
|
|
@@ -58,11 +65,11 @@ namespace TCCInvoice
|
|
|
private const string BUSINESS_NAME_API = "http://gcis.nat.g0v.tw/api/show/";
|
|
|
private const string CARRIER_TYPE_BARCODE = "3J0002";
|
|
|
private const int DEFAULT_DONATE_MARK = 1;
|
|
|
- private const string DEFAULT_LOVECODE = "591"; // 待台泥提供愛心碼
|
|
|
+ private const string DEFAULT_LOVECODE = "4997276";
|
|
|
|
|
|
private const string PREINVOICE_PATH = @"C:\UXB2B_EIVO\PreInvoice\";
|
|
|
- private const string INVOICE_RESPONSE_PATH = @"C:\UXB2B_EIVO\PreInvoice(Response)\";
|
|
|
- private const string INVOICE_FAILURE_PATH = @"C:\UXB2B_EIVO\PreInvoice(Failure)\";
|
|
|
+ private const string PREINVOICE_RESPONSE_PATH = @"C:\UXB2B_EIVO\PreInvoice(Response)\";
|
|
|
+ private const string SELLER_INVOICE_RESPONSE_PATH = @"C:\Gateway-83196607\logs\InvoiceNoInspector\SellerInvoice(Response)\";
|
|
|
#endregion
|
|
|
|
|
|
#region Properties
|
|
@@ -71,7 +78,11 @@ namespace TCCInvoice
|
|
|
/// </summary>
|
|
|
public string DataNumber
|
|
|
{
|
|
|
- set => dataNumber = value;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ Reset();
|
|
|
+ dataNumber = value;
|
|
|
+ }
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// (必填)發票日期
|
|
@@ -98,7 +109,7 @@ namespace TCCInvoice
|
|
|
|
|
|
if (buyerId.Equals(DEFAULT_BUYER_ID)) // 一般消費者
|
|
|
{
|
|
|
- buyerName = GenerateRandom4Digit().ToString();
|
|
|
+ buyerName = GenerateRandom4Digit();
|
|
|
}
|
|
|
else // 有統編
|
|
|
{
|
|
@@ -188,53 +199,87 @@ namespace TCCInvoice
|
|
|
#region Constructors
|
|
|
public InvoiceGenerator()
|
|
|
{
|
|
|
- xmlWatcher = new FileSystemWatcher();
|
|
|
- xmlWatcher.Path = INVOICE_RESPONSE_PATH;
|
|
|
- xmlWatcher.Filter = "*.xml";
|
|
|
- xmlWatcher.IncludeSubdirectories = false;
|
|
|
- xmlWatcher.EnableRaisingEvents = true;
|
|
|
- xmlWatcher.Created += InvoiceXmlCreated;
|
|
|
+ preInvoiceResponseWatcher = new FileSystemWatcher()
|
|
|
+ {
|
|
|
+ Path = PREINVOICE_RESPONSE_PATH,
|
|
|
+ Filter = "*.xml",
|
|
|
+ IncludeSubdirectories = false,
|
|
|
+ EnableRaisingEvents = true,
|
|
|
+ };
|
|
|
+ preInvoiceResponseWatcher.Created += PreInvoiceResponse_Created;
|
|
|
+
|
|
|
+ sellerInvoiceResponseWatcher = new FileSystemWatcher()
|
|
|
+ {
|
|
|
+ Path = SELLER_INVOICE_RESPONSE_PATH,
|
|
|
+ Filter = "*.xml",
|
|
|
+ IncludeSubdirectories = false,
|
|
|
+ EnableRaisingEvents = true,
|
|
|
+ };
|
|
|
+ sellerInvoiceResponseWatcher.Created += SellerInvoiceResponse_Created;
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region Events & EventHandlers
|
|
|
public delegate void InvoiceGenerateEventHandler(string dataNumber, string invoiceNumber,
|
|
|
- string invoiceDate, string invoiceTime, string carrierNumber);
|
|
|
+ string invoiceDate, string invoiceTime, string randomNumber);
|
|
|
public event InvoiceGenerateEventHandler InvoiceGenerated;
|
|
|
|
|
|
- public delegate void InvoiceFailEventHandler(string dataNumber, string description);
|
|
|
- public event InvoiceFailEventHandler InvoiceGenerationFailed;
|
|
|
+ public delegate void InvoiceAssignNumberFailEventHandler(string dataNumber, string description);
|
|
|
+ public event InvoiceAssignNumberFailEventHandler InvoiceAssignNumberFailed;
|
|
|
|
|
|
- private void InvoiceXmlCreated(object sender, FileSystemEventArgs e)
|
|
|
+ public delegate void InvoiceUploadFailEventHandler(string dataNumber, string invoiceNumber, string description);
|
|
|
+ public event InvoiceUploadFailEventHandler InvoiceUploadFailed;
|
|
|
+
|
|
|
+ private void PreInvoiceResponse_Created(object sender, FileSystemEventArgs e)
|
|
|
{
|
|
|
XDocument xDoc = XDocument.Load(e.FullPath);
|
|
|
-
|
|
|
+
|
|
|
string status = xDoc.Descendants("Status").ElementAt(0).Value;
|
|
|
- if (status == "1")
|
|
|
+ if (status == "1") // 配號成功
|
|
|
{
|
|
|
- string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
|
|
|
- string datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
|
|
|
- string invoicedate = xDoc.Descendants("InvoiceDate").ElementAt(0).Value;
|
|
|
- string invoicetime = xDoc.Descendants("InvoiceTime").ElementAt(0).Value;
|
|
|
- string carriernumber = carrierId1;
|
|
|
-
|
|
|
- InvoiceGenerated?.Invoke(datanumber, invoicenumber, invoicedate, invoicetime, carriernumber);
|
|
|
+ responseInvoiceNumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
|
|
|
+ responseDataNumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
|
|
|
+ responseInvoiceDate = xDoc.Descendants("InvoiceDate").ElementAt(0).Value;
|
|
|
+ responseInvoiceTime = xDoc.Descendants("InvoiceTime").ElementAt(0).Value;
|
|
|
}
|
|
|
- else // Failure
|
|
|
+ else // 配號失敗
|
|
|
{
|
|
|
- string description = xDoc.Descendants("Description").ElementAt(0).Value;
|
|
|
- string datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
|
|
|
+ responseInvoiceError = xDoc.Descendants("Description").ElementAt(0).Value;
|
|
|
+ responseDataNumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
|
|
|
|
|
|
- InvoiceGenerationFailed?.Invoke(datanumber, description);
|
|
|
- }
|
|
|
+ InvoiceAssignNumberFailed?.Invoke(responseDataNumber, responseInvoiceError);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
+ private void SellerInvoiceResponse_Created(object sender, FileSystemEventArgs e)
|
|
|
+ {
|
|
|
+ XDocument xDoc = XDocument.Load(e.FullPath);
|
|
|
+
|
|
|
+ string status = xDoc.Descendants("Status").ElementAt(0).Value;
|
|
|
+ if (status == "1") // 上傳成功
|
|
|
+ {
|
|
|
+ string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
|
|
|
+ if (!String.IsNullOrEmpty(responseInvoiceNumber) && responseInvoiceNumber == invoicenumber)
|
|
|
+ {
|
|
|
+ InvoiceGenerated?.Invoke(responseDataNumber, responseInvoiceNumber, responseInvoiceDate,
|
|
|
+ responseInvoiceTime, this.randomNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else // 上傳失敗
|
|
|
+ {
|
|
|
+ string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
|
|
|
+ responseInvoiceError = xDoc.Descendants("Description").ElementAt(0).Value;
|
|
|
+ if (!String.IsNullOrEmpty(responseInvoiceNumber) && responseInvoiceNumber == invoicenumber)
|
|
|
+ {
|
|
|
+ InvoiceUploadFailed?.Invoke(responseDataNumber, responseInvoiceNumber, responseInvoiceError);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region Instance Methods
|
|
|
/// <summary>
|
|
|
- /// 加入S消費品項明細
|
|
|
+ /// 加入消費品項明細
|
|
|
/// </summary>
|
|
|
/// <param name="sequenceNumber">發票明細之排列序號</param>
|
|
|
/// <param name="description">產品名稱</param>
|
|
@@ -273,8 +318,6 @@ namespace TCCInvoice
|
|
|
{
|
|
|
;
|
|
|
}
|
|
|
-
|
|
|
- ResetPreInvoiceInfo();
|
|
|
}
|
|
|
|
|
|
private void GeneratePreinvoiceXML()
|
|
@@ -293,6 +336,7 @@ namespace TCCInvoice
|
|
|
new XElement("SalesAmount", salesAmount),
|
|
|
new XElement("FreeTaxSalesAmount", freeTaxSalesAmount),
|
|
|
new XElement("ZeroTaxSalesAmount", zeroTaxSalesAmount),
|
|
|
+ new XElement("RandomNumber", randomNumber),
|
|
|
new XElement("InvoiceType", invoiceType),
|
|
|
new XElement("TaxType", taxType),
|
|
|
new XElement("TaxRate", taxRate),
|
|
@@ -332,19 +376,20 @@ namespace TCCInvoice
|
|
|
xDoc.Save(PREINVOICE_PATH + dataNumber + ".xml");
|
|
|
}
|
|
|
|
|
|
- private void ResetPreInvoiceInfo()
|
|
|
+ private void Reset()
|
|
|
{
|
|
|
dataNumber = null;
|
|
|
dataDate = DateTime.Today;
|
|
|
buyerId = null;
|
|
|
buyerName = null;
|
|
|
customsClearanceMark = null;
|
|
|
+ randomNumber = GenerateRandom4Digit();
|
|
|
salesAmount = 0;
|
|
|
taxAmount = 0;
|
|
|
totalAmount = 0;
|
|
|
carrierType = null;
|
|
|
- //carrierId1 = null; // 不重置,保留到發票開立後的事件通知時回傳載具號碼
|
|
|
- //carrierId2 = null; // 與carrierId1同進退
|
|
|
+ carrierId1 = null;
|
|
|
+ carrierId2 = null;
|
|
|
mainRemark = null;
|
|
|
donateMark = 1;
|
|
|
nPOBAN = DEFAULT_LOVECODE;
|
|
@@ -352,6 +397,12 @@ namespace TCCInvoice
|
|
|
contactAddress = null;
|
|
|
contactPhone = null;
|
|
|
invoiceItems.Clear();
|
|
|
+
|
|
|
+ responseInvoiceNumber = null;
|
|
|
+ responseDataNumber = null;
|
|
|
+ responseInvoiceDate = null;
|
|
|
+ responseInvoiceTime = null;
|
|
|
+ responseInvoiceError = null;
|
|
|
}
|
|
|
|
|
|
private async Task GetBuyerNameFromBuyerIdAsync()
|
|
@@ -362,7 +413,7 @@ namespace TCCInvoice
|
|
|
{
|
|
|
var result = await client.GetFromJsonAsync<BusinessName>(BUSINESS_NAME_API + buyerId);
|
|
|
|
|
|
- buyerName = GenerateRandom4Digit().ToString();
|
|
|
+ buyerName = GenerateRandom4Digit();
|
|
|
if (result.data != null && result.data.財政部 != null)
|
|
|
{
|
|
|
buyerName = result.data.財政部.營業人名稱; // 1st try
|
|
@@ -378,17 +429,17 @@ namespace TCCInvoice
|
|
|
}
|
|
|
catch (Exception)
|
|
|
{
|
|
|
- buyerName = GenerateRandom4Digit().ToString();
|
|
|
+ buyerName = GenerateRandom4Digit();
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private int GenerateRandom4Digit()
|
|
|
+ private string GenerateRandom4Digit()
|
|
|
{
|
|
|
- int min = 1000;
|
|
|
+ int min = 0;
|
|
|
int max = 9999;
|
|
|
- Random rdm = new Random();
|
|
|
- return rdm.Next(min, max);
|
|
|
+ Random rdm = new Random(Guid.NewGuid().GetHashCode());
|
|
|
+ return rdm.Next(min, max).ToString().PadLeft(4, '0');
|
|
|
}
|
|
|
#endregion
|
|
|
|