public virtual Exception Validate(Payment dataItem, decimal?totalAllowanceAmount = null, String remark = null, DateTime?allowanceDate = null)
        {
            _payment = dataItem;
            _totalAllowanceAmount = totalAllowanceAmount ?? _payment.PayoffAmount;
            _remark        = remark;
            _allowanceDate = allowanceDate ?? DateTime.Now;

            Exception ex;

            _seller  = null;
            _newItem = null;

            if ((ex = CheckBusiness()) != null)
            {
                return(ex);
            }

            if ((ex = CheckMandatoryFields()) != null)
            {
                return(ex);
            }

            if ((ex = CheckAllowanceItem()) != null)
            {
                return(ex);
            }

            return(null);
        }
        public static WebHome.Models.MIG3_1.D0501.CancelAllowance CreateD0501(this InvoiceAllowance item)
        {
            InvoiceAllowanceCancellation InvCanlAllow = item.InvoiceAllowanceCancellation;

            if (InvCanlAllow == null)
            {
                return(null);
            }

            var result = new WebHome.Models.MIG3_1.D0501.CancelAllowance
            {
                CancelAllowanceNumber = item.AllowanceNumber,
                AllowanceDate         = String.Format("{0:yyyyMMdd}", item.AllowanceDate.Value),
                BuyerId      = item.BuyerId,
                SellerId     = item.SellerId,
                CancelDate   = String.Format("{0:yyyyMMdd}", InvCanlAllow.CancelDate.Value),
                CancelTime   = InvCanlAllow.CancelDate.Value,
                CancelReason = InvCanlAllow.CancelReason,
                Remark       = InvCanlAllow.Remark,
            };

            return(result);
        }
        public static WebHome.Models.MIG3_1.D0401.Allowance CreateD0401(this InvoiceAllowance item)
        {
            var result = new WebHome.Models.MIG3_1.D0401.Allowance
            {
                Main = new WebHome.Models.MIG3_1.D0401.Main
                {
                    AllowanceNumber = item.AllowanceNumber,
                    AllowanceDate   = String.Format("{0:yyyyMMdd}", item.AllowanceDate),
                    AllowanceType   = (WebHome.Models.MIG3_1.D0401.AllowanceTypeEnum)((int)item.AllowanceType),
                    Buyer           = new WebHome.Models.MIG3_1.D0401.MainBuyer
                    {
                        Address = string.IsNullOrEmpty(item.InvoiceAllowanceBuyer.Address)?
                                  "":
                                  item.InvoiceAllowanceBuyer.Address.Length > 100?
                                  item.InvoiceAllowanceBuyer.Address.Substring(0, 100):
                                  item.InvoiceAllowanceBuyer.Address,
                        //CustomerNumber = item.InvoiceAllowanceBuyer.CustomerName,
                        EmailAddress    = "",//item.InvoiceAllowanceBuyer.EMail,
                        FacsimileNumber = String.IsNullOrEmpty(item.InvoiceAllowanceBuyer.Fax)?
                                          "":
                                          item.InvoiceAllowanceBuyer.Fax.Length > 26?
                                          item.InvoiceAllowanceBuyer.Fax.Substring(0, 26):
                                          item.InvoiceAllowanceBuyer.Fax,
                        Identifier = item.InvoiceAllowanceBuyer.ReceiptNo,
                        Name       = item.InvoiceAllowanceBuyer.IsB2C()
                            ? Encoding.GetEncoding(950).GetBytes(item.InvoiceAllowanceBuyer.Name.InsteadOfNullOrEmpty("")).Length == 4
                                ? item.InvoiceAllowanceBuyer.Name : ValueValidity.GenerateRandomCode(4)
                            : String.IsNullOrEmpty(item.InvoiceAllowanceBuyer.Name)
                                ? item.InvoiceAllowanceBuyer.ReceiptNo : item.InvoiceAllowanceBuyer.Name,
                        PersonInCharge = String.IsNullOrEmpty(item.InvoiceAllowanceBuyer.PersonInCharge)?
                                         "":
                                         item.InvoiceAllowanceBuyer.PersonInCharge.Length > 30?
                                         item.InvoiceAllowanceBuyer.PersonInCharge.Substring(0, 30):
                                         item.InvoiceAllowanceBuyer.PersonInCharge,
                        RoleRemark      = item.InvoiceAllowanceBuyer.RoleRemark,
                        TelephoneNumber = "",//item.InvoiceAllowanceBuyer.Phone,
                    },
                    Seller = new WebHome.Models.MIG3_1.D0401.MainSeller
                    {
                        Address = String.IsNullOrEmpty(item.InvoiceAllowanceSeller.Address)?
                                  "":
                                  item.InvoiceAllowanceSeller.Address.Length > 100 ?
                                  item.InvoiceAllowanceSeller.Address.Substring(0, 100) :
                                  item.InvoiceAllowanceSeller.Address,
                        //CustomerNumber = item.InvoiceAllowanceSeller.CustomerName,
                        EmailAddress    = "",//item.InvoiceAllowanceSeller.EMail,
                        FacsimileNumber = String.IsNullOrEmpty(item.InvoiceAllowanceSeller.Fax)?
                                          "":
                                          item.InvoiceAllowanceSeller.Fax.Length > 26?
                                          item.InvoiceAllowanceSeller.Fax.Substring(0, 26):
                                          item.InvoiceAllowanceSeller.Fax,
                        Identifier     = item.InvoiceAllowanceSeller.ReceiptNo,
                        Name           = item.InvoiceAllowanceSeller.Name,
                        PersonInCharge = String.IsNullOrEmpty(item.InvoiceAllowanceSeller.PersonInCharge)?
                                         "":
                                         item.InvoiceAllowanceSeller.PersonInCharge.Length > 30?
                                         item.InvoiceAllowanceSeller.PersonInCharge.Substring(0, 30):
                                         item.InvoiceAllowanceSeller.PersonInCharge,
                        RoleRemark      = item.InvoiceAllowanceSeller.RoleRemark,
                        TelephoneNumber = "",//item.InvoiceAllowanceSeller.Phone,
                    },
                },
                Amount = new WebHome.Models.MIG3_1.D0401.Amount
                {
                    TaxAmount   = item.TaxAmount.HasValue ? (long)item.TaxAmount.Value : 0,
                    TotalAmount = item.TotalAmount.HasValue ? (long)item.TotalAmount.Value : 0,
                },
            };

            result.Details = item.InvoiceAllowanceDetails.Select(d => new WebHome.Models.MIG3_1.D0401.DetailsProductItem
            {
                AllowanceSequenceNumber = d.InvoiceAllowanceItem.No.ToString(),
                Amount = d.InvoiceAllowanceItem.Amount.HasValue ? d.InvoiceAllowanceItem.Amount.Value : 0m,
                OriginalDescription    = d.InvoiceAllowanceItem.OriginalDescription,
                OriginalInvoiceDate    = String.Format("{0:yyyyMMdd}", d.InvoiceAllowanceItem.InvoiceDate),
                OriginalInvoiceNumber  = d.InvoiceAllowanceItem.InvoiceNo,
                OriginalSequenceNumber = d.InvoiceAllowanceItem.OriginalSequenceNo.HasValue ? d.InvoiceAllowanceItem.OriginalSequenceNo.Value.ToString() : "1",
                Quantity  = d.InvoiceAllowanceItem.Piece.HasValue ? d.InvoiceAllowanceItem.Piece.Value : 0.00000M,
                Tax       = (long)d.InvoiceAllowanceItem.Tax.Value,
                TaxType   = (WebHome.Models.MIG3_1.D0401.DetailsProductItemTaxType)(int) d.InvoiceAllowanceItem.TaxType,
                Unit      = d.InvoiceAllowanceItem.PieceUnit,
                UnitPrice = d.InvoiceAllowanceItem.UnitCost.HasValue ? d.InvoiceAllowanceItem.UnitCost.Value : 0,
            }).ToArray();

            return(result);
        }
        protected virtual Exception CheckAllowanceItem()
        {
            _productItems = new List <InvoiceAllowanceItem>();
            var invTable = _mgr.GetTable <InvoiceItem>();

            InvoiceItem originalInvoice = _payment.InvoiceItem;

            if (originalInvoice == null)
            {
                return(new Exception("發票資料不存在!!"));
            }

            if (originalInvoice.InvoiceCancellation != null)
            {
                return(new Exception("該發票已作廢,不可折讓。"));
            }

            InvoiceAllowanceItem allowanceItem;

            if (originalInvoice.InvoiceType == (int)Naming.InvoiceTypeDefinition.一般稅額計算之電子發票)
            {
                allowanceItem = new InvoiceAllowanceItem
                {
                    Amount             = Math.Round(_totalAllowanceAmount.Value / 1.05m),
                    InvoiceNo          = originalInvoice.TrackCode + originalInvoice.No,
                    InvoiceDate        = originalInvoice.InvoiceDate,
                    ItemNo             = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().ItemNo,
                    OriginalSequenceNo = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().No,
                    Piece               = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().Piece,
                    PieceUnit           = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().PieceUnit,
                    OriginalDescription = originalInvoice.InvoiceDetails.First().InvoiceProduct.Brief,
                    TaxType             = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().TaxType,
                    No       = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().No,
                    UnitCost = originalInvoice.InvoiceAmountType.TotalAmount,   //originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().UnitCost,
                    Remark   = _remark,
                };
            }
            else
            {
                allowanceItem = new InvoiceAllowanceItem
                {
                    Amount      = Math.Round(_totalAllowanceAmount.Value / 1.05m),
                    InvoiceNo   = originalInvoice.TrackCode + originalInvoice.No,
                    InvoiceDate = originalInvoice.InvoiceDate,
                    //ItemNo = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().ItemNo,
                    //OriginalSequenceNo = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().No,
                    //Piece = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().Piece,
                    //PieceUnit = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().PieceUnit,
                    //OriginalDescription = originalInvoice.InvoiceDetails.First().InvoiceProduct.Brief,
                    //TaxType = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().TaxType,
                    //No = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().No,
                    //UnitCost = originalInvoice.InvoiceDetails.First().InvoiceProduct.InvoiceProductItem.First().UnitCost,
                    Remark = _remark,
                };
            }

            allowanceItem.Tax = _totalAllowanceAmount - allowanceItem.Amount;

            _productItems.Add(allowanceItem);


            _newItem = new InvoiceAllowance()
            {
                Document = new Document
                {
                    DocDate = DateTime.Now,
                    DocType = (int)Naming.DocumentTypeDefinition.E_Allowance
                },
                AllowanceDate   = _allowanceDate,
                AllowanceNumber = originalInvoice.TrackCode + originalInvoice.No,
                AllowanceType   = 1,
                InvoiceID       = originalInvoice.InvoiceID,
                BuyerId         = originalInvoice.InvoiceBuyer.ReceiptNo,
                SellerId        = _seller.ReceiptNo,
                TaxAmount       = allowanceItem.Tax,
                TotalAmount     = allowanceItem.Amount,
                //InvoiceID =  invTable.Where(i=>i.TrackCode + i.No == item.AllowanceItem.Select(a=>a.OriginalInvoiceNumber).FirstOrDefault()).Select(i=>i.InvoiceID).FirstOrDefault(),
                InvoiceAllowanceBuyer = new InvoiceAllowanceBuyer
                {
                    Name         = originalInvoice.InvoiceBuyer.Name,
                    ReceiptNo    = originalInvoice.InvoiceBuyer.ReceiptNo,
                    CustomerID   = originalInvoice.InvoiceBuyer.CustomerID,
                    ContactName  = originalInvoice.InvoiceBuyer.ContactName,
                    CustomerName = originalInvoice.InvoiceBuyer.CustomerName
                },
                InvoiceAllowanceSeller = new InvoiceAllowanceSeller
                {
                    Name           = _seller.CompanyName,
                    ReceiptNo      = _seller.ReceiptNo,
                    Address        = _seller.Addr,
                    ContactName    = _seller.ContactName,
                    CustomerName   = _seller.CompanyName,
                    EMail          = _seller.ContactEmail,
                    Fax            = _seller.Fax,
                    Phone          = _seller.Phone,
                    PersonInCharge = _seller.UndertakerName,
                    SellerID       = _seller.CompanyID,
                }
            };

            _newItem.InvoiceAllowanceDetails.AddRange(_productItems.Select(p => new InvoiceAllowanceDetails
            {
                InvoiceAllowanceItem = p,
            }));

            _payment.InvoiceAllowance = _newItem;

            return(null);
        }