Exemple #1
0
        public static async Task CopyToFortnox(
            // Trigger every six minutes, offset by three.
            [TimerTrigger("0 3-59/6 * * * *")] TimerInfo timer,
            ILogger logger)
        {
            try
            {
                var webcrmClientFactory = new WebcrmClientFactory(logger, TypedEnvironment.WebcrmApiBaseUrl);
                var fortnoxQueue        = await FortnoxQueue.Create(TypedEnvironment.AzureWebJobsStorage);

                var webcrmChangeTracker = WebcrmToFortnoxChangeTracker.Create(logger, webcrmClientFactory, fortnoxQueue);

                var configService = await FortnoxConfigService.Create(TypedEnvironment.DatabaseCredentials);

                var configurations = configService.LoadEnabledFortnoxConfigurations();
                foreach (var configuration in configurations)
                {
                    var dateTimeBeforeSync = DateTime.UtcNow;
                    await webcrmChangeTracker.EnqueueUpsertedItemsToFortnox(configuration.LastSuccessfulCopyToErpHeartbeat, configuration);

                    await configService.UpdateLastSuccessfulCopyToErpHeartbeat(configuration.WebcrmSystemId, dateTimeBeforeSync);
                }
            }
            catch (SwaggerException ex)
            {
                SwaggerExceptionLogger.Log(ex);
            }
        }
Exemple #2
0
        public static async Task CopyFromFortnox(
            // Trigger every six minutes.
            [TimerTrigger("0 */6 * * * *")] TimerInfo timer,
            ILogger logger)
        {
            try
            {
                var changeTracker = await FortnoxChangeTracker.Create(
                    logger,
                    TypedEnvironment.AzureWebJobsStorage);

                var configService = await FortnoxConfigService.Create(TypedEnvironment.DatabaseCredentials);

                var configurations = configService.LoadEnabledFortnoxConfigurations();
                foreach (var configuration in configurations)
                {
                    var dateTimeBeforeSync = DateTime.UtcNow;
                    await changeTracker.EnqueueUpsertedItems(configuration.LastSuccessfulCopyFromErpHeartbeat, configuration);

                    await configService.UpdateLastSuccessfulCopyFromErpHeartbeat(configuration.WebcrmSystemId, dateTimeBeforeSync);
                }
            }
            catch (SwaggerException ex)
            {
                SwaggerExceptionLogger.Log(ex);
            }
        }
        public static async Task <FortnoxMessageDispatcher> Create(
            ILogger logger,
            WebcrmClientFactory webcrmClientFactory,
            DatabaseCredentials databaseCredentials)
        {
            var fortnoxConfigService = await FortnoxConfigService.Create(databaseCredentials);

            return(new FortnoxMessageDispatcher(logger, webcrmClientFactory, fortnoxConfigService));
        }
 private FortnoxMessageDispatcher(
     ILogger logger,
     WebcrmClientFactory webcrmClientFactory,
     FortnoxConfigService fortnoxConfigService)
 {
     Logger = logger;
     WebcrmClientFactory  = webcrmClientFactory;
     FortnoxConfigService = fortnoxConfigService;
 }
Exemple #5
0
        public static async Task <FortnoxChangeTracker> Create(
            ILogger logger,
            WebcrmClientFactory webcrmClientFactory,
            string storageAccountConnectionString,
            DatabaseCredentials databaseCredentials)
        {
            var fortnoxConfigService = await FortnoxConfigService.Create(databaseCredentials);

            return(new FortnoxChangeTracker(logger, webcrmClientFactory, storageAccountConnectionString, fortnoxConfigService));
        }
Exemple #6
0
 private FortnoxChangeTracker(
     ILogger logger,
     WebcrmClientFactory webcrmClientFactory,
     string storageAccountConnectionString,
     FortnoxConfigService fortnoxConfigService)
 {
     Logger = logger;
     WebcrmClientFactory            = webcrmClientFactory;
     StorageAccountConnectionString = storageAccountConnectionString;
     FortnoxConfigService           = fortnoxConfigService;
 }
        public async Task HandleDequeuedMessage(FortnoxQueueMessage message)
        {
            switch (message.Action)
            {
            case FortnoxQueueAction.UpsertFortnoxDelivery:
            {
                var payload       = JsonConvert.DeserializeObject <UpsertDeliveryFromFortnoxPayload>(message.SerializedPayload);
                var configuration = FortnoxConfigService.LoadFortnoxConfiguration(payload.WebcrmSystemId);
                var dataCopier    = await FortnoxDataCopier.Create(Logger, WebcrmClientFactory, configuration);

                await dataCopier.CopyDeliveryToFortnox(payload.FortnoxCustomerNumber, payload.FortnoxCustomerNumber, configuration.OrganisationIdFieldName);
            }
            break;

            case FortnoxQueueAction.UpsertWebcrmOrganisation:
            {
                var payload = JsonConvert.DeserializeObject <UpsertOrganisationFromFortnoxPayload>(message.SerializedPayload);

                var configuration = FortnoxConfigService.LoadFortnoxConfiguration(payload.WebcrmSystemId);
                var dataCopier    = await FortnoxDataCopier.Create(Logger, WebcrmClientFactory, configuration);

                await dataCopier.CopyOrganisationFromFortnox(payload.FortnoxCustomerNumber, configuration.OrganisationIdFieldName);
            }
            break;

            case FortnoxQueueAction.UpsertFortnoxOrganisation:
            {
                var payload = JsonConvert.DeserializeObject <UpsertOrganisationToFortnox>(message.SerializedPayload);

                // TODO 1358: Only update Fortnox if a custom checkbox list contains a checked item that says something like "Fortnox Customer". Otherwise we should not sync the organisation.

                var configuration = FortnoxConfigService.LoadFortnoxConfiguration(payload.WebcrmSystemId);
                var dataCopier    = await FortnoxDataCopier.Create(Logger, WebcrmClientFactory, configuration);

                await dataCopier.CopyOrganisationToFortnox(payload.Organisation, configuration.OrganisationIdFieldName);
            }
            break;

            case FortnoxQueueAction.Unknown:
            default:
                throw new ApplicationException($"The action '{message.Action}' is not supported.");
            }
        }
Exemple #8
0
        public async Task EnqueueUpsertedInvoices()
        {
            var configurations = FortnoxConfigService.LoadEnabledFortnoxConfigurations();

            foreach (var configuration in configurations)
            {
                // Store time we are using to detect changes
                var dateTimeBeforeSync = DateTime.UtcNow;

                var dataCopier = await FortnoxDataCopier.Create(
                    Logger,
                    WebcrmClientFactory,
                    configuration);

                await dataCopier.EnqueueRecentlyUpsertedInvoices(
                    StorageAccountConnectionString,
                    configuration.WebcrmSystemId,
                    configuration.LastSuccessfulCopyFromErpHeartbeat);

                configuration.LastSuccessfulCopyFromErpHeartbeat = dateTimeBeforeSync;
                await FortnoxConfigService.SaveFortnoxConfiguration(configuration);
            }
        }
Exemple #9
0
 public FortnoxConfigServiceTester()
 {
     // It's safe to use .Result in the tests.
     ConfigService = Task.Run(() => FortnoxConfigService.Create(TestTypedEnvironment.DatabaseCredentials)).Result;
 }