public string ValidateFormalRemitRequestAndUpdateRemitRecord(RemitRequest remitRequest, RemitRecord remitRecord, UserArc userArc, String country)
        {
            string error = null;

            // check ToCurrency
            error = CheckCurrencyExistence(remitRequest);
            if (error != null)
            {
                return(error);
            }
            remitRecord.FeeType      = remitRequest.FeeType;
            remitRecord.Fee          = remitRequest.Fee;
            remitRecord.ToCurrencyId = remitRequest.ToCurrencyId;

            // check amount
            error = CheckIfAmountOutOfRange(userArc.UserId, remitRequest.FromAmount, "TW");
            if (error != null)
            {
                return(error);
            }
            ExchangeRate applyExchangeRate = exchangeRateService.GetExchangeRateByCurrencyName(remitRequest.ToCurrency);

            remitRecord.FromAmount        = remitRequest.FromAmount;
            remitRecord.ApplyExchangeRate = applyExchangeRate.Rate;
            remitRecord.FromCurrencyId    = currencyService.GetCurrencyByCountry(country)[0].Id;

            // check Beneficiary
            error = CheckBenificiarExistence(remitRequest.BeneficiaryId);
            if (error != null)
            {
                return(error);
            }
            remitRecord.BeneficiaryId = remitRequest.BeneficiaryId;

            // check uploaded picture
            error = CheckPhotoFileExistence(userArc, remitRecord.RealTimePic);
            if (error != null)
            {
                return(error);
            }
            error = CheckSignatureFileExistence(userArc, remitRecord.ESignature);
            if (error != null)
            {
                return(error);
            }

            // check discount
            if (remitRequest.DiscountId != null)
            {
                error = CheckDiscountExistence(remitRequest);
                if (error != null)
                {
                    return(error);
                }
                remitRecord.DiscountId     = remitRequest.DiscountId;
                remitRecord.DiscountAmount = remitRequest.DiscountAmount;
            }

            remitRecord.TransactionStatus = (short)RemitTransactionStatusEnum.WaitingArcVerifying;

            return(error);
        }