# frozen_string_literal: true module Reports class DocxJob < ApplicationJob extend InputSanitizeHelper include InputSanitizeHelper include FailedDeliveryNotifiableJob queue_as :reports def perform(report_id, user_id:, root_url:) report = Report.find(report_id) user = User.find(user_id) file = Tempfile.new(['report', '.docx']) begin I18n.backend.date_format = user.settings[:date_format] docx = Caracal::Document.new(file.path) Reports::Docx.new(report, docx, user: user, scinote_url: root_url).draw docx.save report.docx_file.attach(io: file, filename: 'report.docx') report.docx_ready! report_path = Rails.application.routes.url_helpers .reports_path(team: report.team.id, preview_report_id: report.id, preview_type: :docx) DeliveryNotification.with( title: I18n.t('projects.reports.index.generation.completed_docx_notification_title'), message: I18n.t('projects.reports.index.generation.completed_notification_message', report_link: "#{escape_input(report.name)}", team_name: escape_input(report.team.name)) ).deliver(user) Reports::DocxPreviewJob.perform_now(report.id) ensure I18n.backend.date_format = nil file.close file.unlink end rescue StandardError => e raise e if report.blank? ActiveRecord::Base.no_touching do report.docx_error! end Rails.logger.error("Couldn't generate DOCX for Report with id: #{report.id}. Error:\n #{e.message}") raise e end private # Overrides method from FailedDeliveryNotifiableJob concern def failed_notification_title I18n.t('projects.reports.index.generation.error_docx_notification_title') end # Overrides method from FailedDeliveryNotifiableJob concern def failed_notification_message report = Report.find_by(id: arguments.first) return '' if report.blank? report_path = if report.docx_file.attached? Rails.application.routes.url_helpers .reports_path(team: report.team.id, preview_report_id: report.id, preview_type: :docx) else Rails.application.routes.url_helpers.reports_path(team: report.team.id) end I18n.t('projects.reports.index.generation.error_notification_message', report_link: "#{escape_input(report.name)}", team_name: escape_input(report.team.name)) end end end