Эх сурвалжийг харах

1.新增隨機碼; 2.事件通知修改為發票開立通知、配號成功通知、配號成功但上傳失敗通知等三種; 3.台泥指定愛心碼

Snoopy 3 жил өмнө
parent
commit
728930f5ef

+ 94 - 43
TCCInvoice/InvoiceGenerator.cs

@@ -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
 

+ 19 - 9
TCCInvoice/Program.cs

@@ -15,11 +15,13 @@ namespace TCCInvoice
 
             // 註冊發票號碼已開立的事件通知
             myInvoice.InvoiceGenerated += MyInvoice_InvoiceGenerated;
-            // 註冊發票號碼開立失敗的事件通知
-            myInvoice.InvoiceGenerationFailed += MyInvoice_InvoiceGenerationFailed;
+            // 註冊發票號碼配號失敗的事件通知
+            myInvoice.InvoiceAssignNumberFailed += MyInvoice_InvoiceAssignNumberFailed;
+            // 註冊發票號碼上傳失敗的事件通知
+            myInvoice.InvoiceUploadFailed += MyInvoice_InvoiceUploadFailed;
 
             // 填具待開立發票的相關資料(Preinvoice)
-            myInvoice.DataNumber = "202202080058";
+            myInvoice.DataNumber = "202202120223";
             myInvoice.DataDate = DateTime.Today;
             myInvoice.BuyerId = null; // 一般消費者
             myInvoice.TotalAmount = 524;
@@ -27,7 +29,7 @@ namespace TCCInvoice
             myInvoice.ContactEmail = "snoopy.h.huang@outlook.com";
             myInvoice.ContactPhone = "0929168960";
             myInvoice.AddInvoiceItem(0, "充電服務費", 41.5793, "度", 12, 499, "充電服務費每度12元");
-            myInvoice.AddInvoiceItem(1, "占用費", 0.5, "小時", 50, 25, "占用費每小時50元");
+            myInvoice.AddInvoiceItem(1, "占用費", 30, "分鐘", 50, 25, "占用費每小時50元");
             //開立發票
             myInvoice.GetInvoiceResponse();
 
@@ -47,21 +49,29 @@ namespace TCCInvoice
         }
 
         private static void MyInvoice_InvoiceGenerated(string dataNumber, string invoiceNumber,
-                                                       string invoiceDate, string invoiceTime, string carrierNumber)
+                                                       string invoiceDate, string invoiceTime, string randomNumber)
         {
-            Console.WriteLine("發票開立-----");
+            Console.WriteLine("發票開立成功-----");
             Console.WriteLine("單據編號:" + dataNumber);
             Console.WriteLine("發票號碼:" + invoiceNumber);
             Console.WriteLine("發票日期:" + invoiceDate);
             Console.WriteLine("發票時間:" + invoiceTime);
-            Console.WriteLine("載具號碼:" + carrierNumber);
+            Console.WriteLine("隨機碼:" + randomNumber);
         }
 
-        private static void MyInvoice_InvoiceGenerationFailed(string dataNumber, string description)
+        private static void MyInvoice_InvoiceAssignNumberFailed(string dataNumber, string description)
         {
-            Console.WriteLine("發票開立失敗-----");
+            Console.WriteLine("發票配號失敗-----");
             Console.WriteLine("單據編號:" + dataNumber);
             Console.WriteLine("錯誤代碼與描述:" + description);
         }
+
+        private static void MyInvoice_InvoiceUploadFailed(string dataNumber, string invoiceNumber, string description)
+        {
+            Console.WriteLine("發票已配號但是上傳失敗-----");
+            Console.WriteLine("單據編號:" + dataNumber);
+            Console.WriteLine("發票配號:" + invoiceNumber);
+            Console.WriteLine("錯誤代碼與描述:" + description);
+        }
     }
 }