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); } }
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; }
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)); }
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."); } }
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); } }
public FortnoxConfigServiceTester() { // It's safe to use .Result in the tests. ConfigService = Task.Run(() => FortnoxConfigService.Create(TestTypedEnvironment.DatabaseCredentials)).Result; }