예제 #1
0
        internal static Dto.QueryTaxpayerRequest CreateQueryTaxpayerRequest(TechnicalUser user, SoftwareIdentification software, string taxNumber)
        {
            var request = CreateRequest <Dto.QueryTaxpayerRequest>(user, software);

            request.taxNumber = taxNumber;
            return(request);
        }
예제 #2
0
        private static string GetRequestSignature(TechnicalUser user, string requestId, DateTime timestamp, string additionalSignatureData = null)
        {
            var formattedTimestamp = timestamp.ToString("yyyyMMddHHmmss");
            var signatureData      = $"{requestId}{formattedTimestamp}{user.SigningKey.Value}{additionalSignatureData}";

            return(Sha512.GetSha3Hash(signatureData));
        }
        private static T CreateRequest <T>(TechnicalUser user, SoftwareIdentification software, string additionalSignatureData = null)
            where T : Dto.BasicRequestType, new()
        {
            var requestId = RequestId.CreateRandom();
            var timestamp = DateTime.UtcNow;

            return(new T
            {
                header = new Dto.BasicHeaderType
                {
                    requestId = requestId,
                    timestamp = timestamp.ToString("yyyy-MM-ddTHH:mm:ssZ"),
                    requestVersion = Dto.RequestVersionType.Item20,
                    headerVersion = Dto.HeaderVersionType.Item10
                },
                user = new Dto.UserHeaderType
                {
                    login = user.Login.Value,
                    passwordHash = user.PasswordHash,
                    taxNumber = user.TaxId.Value,
                    requestSignature = GetRequestSignature(user, requestId, timestamp, additionalSignatureData)
                },
                software = new Dto.SoftwareType
                {
                    softwareId = software.Id,
                    softwareName = software.Name,
                    softwareOperation = (Dto.SoftwareOperationType)software.Type,
                    softwareMainVersion = software.MainVersion,
                    softwareDevName = software.DeveloperName,
                    softwareDevContact = software.DeveloperContact,
                    softwareDevCountryCode = software.DeveloperCountry,
                    softwareDevTaxNumber = software.DeveloperTaxNumber
                }
            });
        }
예제 #4
0
        private static T CreateRequest <T>(TechnicalUser user, SoftwareIdentification software, string additionalSignatureData = null)
            where T : Dto.BasicOnlineInvoiceRequestType, new()
        {
            var requestId = RequestId.CreateRandom();
            var nowUtc    = DateTime.UtcNow;
            var timestamp = new DateTime(nowUtc.Year, nowUtc.Month, nowUtc.Day, nowUtc.Hour, nowUtc.Minute, nowUtc.Second, DateTimeKind.Utc);

            return(new T
            {
                header = new Dto.BasicHeaderType
                {
                    requestId = requestId,
                    timestamp = timestamp,
                    requestVersion = RequestVersion,
                    headerVersion = HeaderVersion
                },
                user = new Dto.UserHeaderType
                {
                    login = user.Login.Value,
                    passwordHash = new Dto.CryptoType
                    {
                        cryptoType = PasswordEncryptionAlgorithm,
                        Value = user.PasswordHash
                    },
                    taxNumber = user.TaxId.TaxpayerNumber,
                    requestSignature = new Dto.CryptoType
                    {
                        cryptoType = RequestEncryptionAlgorithm,
                        Value = GetRequestSignature(user, requestId, timestamp, additionalSignatureData)
                    }
                },
                software = new Dto.SoftwareType
                {
                    softwareId = software.Id,
                    softwareName = software.Name,
                    softwareOperation = (Dto.SoftwareOperationType)software.Type,
                    softwareMainVersion = software.MainVersion,
                    softwareDevName = software.DeveloperName,
                    softwareDevContact = software.DeveloperContact,
                    softwareDevCountryCode = software.DeveloperCountry,
                    softwareDevTaxNumber = software.DeveloperTaxNumber
                }
            });
        }
예제 #5
0
        public static NavClient GetNavClient()
        {
            var technicalUser = new TechnicalUser(
                login: Login,
                password: Password,
                signingKey: SigningKey,
                taxId: TaxPayerId,
                encryptionKey: EncryptionKey
                );
            var softwareIdentification = new SoftwareIdentification(
                id: "123456789123456789",
                name: "Test",
                type: SoftwareType.LocalSoftware,
                mainVersion: "1.0",
                developerName: "Test",
                developerContact: "*****@*****.**"
                );

            return(new NavClient(technicalUser, softwareIdentification, NavEnvironment.Test));
        }
예제 #6
0
        private static Dto.ManageInvoiceRequest CreateManageInvoicesRequest <T>(
            TechnicalUser user,
            SoftwareIdentification software,
            ExchangeToken token,
            Dto.ManageInvoiceOperationType operation,
            ISequence <T> invoices,
            Func <T, Dto.InvoiceData> invoiceDataGetter)
        {
            var operations = invoices.Values.Select(item =>
            {
                var invoiceData      = invoiceDataGetter(item.Value);
                var invoiceDataBytes = Encoding.UTF8.GetBytes(XmlManipulator.Serialize(invoiceData));
                return(new Dto.InvoiceOperationType
                {
                    index = item.Index,
                    invoiceData = invoiceDataBytes,
                    invoiceOperation = operation,
                    electronicInvoiceHash = invoiceData.completenessIndicator.Match(
                        t => new Dto.CryptoType
                    {
                        cryptoType = RequestEncryptionAlgorithm,
                        Value = Sha512.GetSha3Hash(Convert.ToBase64String(invoiceDataBytes))
                    },
                        f => null
                        )
                });
            });
            var invoiceHashes        = operations.Select(t => Sha512.GetSha3Hash($"{t.invoiceOperation}{Convert.ToBase64String(t.invoiceData)}"));
            var invoiceSignatureData = string.Join("", invoiceHashes);

            var request = CreateRequest <Dto.ManageInvoiceRequest>(user, software, invoiceSignatureData);

            request.exchangeToken     = Encoding.UTF8.GetString(token.Value);
            request.invoiceOperations = new Dto.InvoiceOperationListType
            {
                compressedContent = false,
                invoiceOperation  = operations.ToArray()
            };

            return(request);
        }
        private static Dto.ManageInvoiceRequest CreateManageInvoicesRequest <T>(TechnicalUser user, SoftwareIdentification software, ExchangeToken token, Dto.ManageInvoiceOperationType operation, ISequentialEnumerable <T> invoices, Func <T, Dto.InvoiceData> mapper)
        {
            var operations = invoices.Select(item => new Dto.InvoiceOperationType
            {
                index            = item.Index,
                invoiceData      = Encoding.UTF8.GetBytes(XmlManipulator.Serialize(mapper(item.Item))),
                invoiceOperation = operation
            });
            var invoiceHashes        = operations.Select(t => Sha512.GetSha3Hash($"{t.invoiceOperation}{Convert.ToBase64String(t.invoiceData)}"));
            var invoiceSignatureData = string.Join("", invoiceHashes);

            var request = CreateRequest <Dto.ManageInvoiceRequest>(user, software, invoiceSignatureData);

            request.exchangeToken     = Encoding.UTF8.GetString(token.Value);
            request.invoiceOperations = new Dto.InvoiceOperationListType
            {
                compressedContent = false,
                invoiceOperation  = operations.ToArray()
            };

            return(request);
        }
 public NavClient(TechnicalUser technicalUser, SoftwareIdentification softwareIdentification, NavEnvironment environment)
 {
     TechnicalUser          = technicalUser;
     SoftwareIdentification = softwareIdentification;
     Client = new Client(HttpClient, environment);
 }
 internal static ResponseResult <ExchangeToken, ExchangeTokenErrorCode> MapExchangeToken(Dto.TokenExchangeResponse response, TechnicalUser user)
 {
     try
     {
         var decryptedToken = Aes.Decrypt(user.EncryptionKey.Value, response.encodedExchangeToken);
         return(new ResponseResult <ExchangeToken, ExchangeTokenErrorCode>(successResult: new ExchangeToken(
                                                                               value: decryptedToken,
                                                                               validFrom: response.tokenValidityFrom,
                                                                               validTo: response.tokenValidityTo
                                                                               )));
     }
     catch
     {
         return(new ResponseResult <ExchangeToken, ExchangeTokenErrorCode>(operationErrorResult: new ErrorResult <ExchangeTokenErrorCode>(
                                                                               errorCode: ExchangeTokenErrorCode.InvalidEncryptionKey
                                                                               )));
     }
 }
예제 #10
0
 internal static Dto.ManageInvoiceRequest CreateManageInvoicesRequest(TechnicalUser user, SoftwareIdentification software, ExchangeToken token, ISequence <ModificationInvoice> invoices)
 {
     return(CreateManageInvoicesRequest(user, software, token, Dto.ManageInvoiceOperationType.MODIFY, invoices, d => RequestMapper.MapModificationInvoice(d)));
 }
예제 #11
0
 internal static Dto.ManageInvoiceRequest CreateManageInvoicesRequest(TechnicalUser user, SoftwareIdentification software, ExchangeToken token, ISequence <Invoice> invoices)
 {
     return(CreateManageInvoicesRequest(user, software, token, Dto.ManageInvoiceOperationType.CREATE, invoices, i => RequestMapper.MapInvoice(i)));
 }
예제 #12
0
        internal static Dto.QueryTransactionStatusRequest CreateQueryTransactionStatusRequest(TechnicalUser user, SoftwareIdentification software, string invoiceId)
        {
            var request = CreateRequest <Dto.QueryTransactionStatusRequest>(user, software);

            request.transactionId = invoiceId;
            return(request);
        }
예제 #13
0
 internal static Dto.TokenExchangeRequest CreateTokenExchangeRequest(TechnicalUser user, SoftwareIdentification software)
 {
     return(CreateRequest <Dto.TokenExchangeRequest>(user, software));
 }