Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TRELLO-2896] Fix slugs in pdfs / emails #1877

Merged
merged 1 commit into from
Feb 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 31 additions & 8 deletions app/controllers/AdminController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import models.event.Event
import models.report._
import models.report.sampledata.SampleDataService
import orchestrators.EmailNotificationOrchestrator
import orchestrators.ReportFileOrchestrator
import play.api.Logger
import play.api.i18n.Lang
import play.api.i18n.Messages
Expand All @@ -30,6 +29,8 @@ import repositories.event.EventRepositoryInterface
import repositories.ipblacklist.BlackListedIp
import repositories.ipblacklist.IpBlackListRepositoryInterface
import repositories.report.ReportRepositoryInterface
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subcategorylabel.SubcategoryLabelRepositoryInterface
import services.AlbertService
import services.PDFService
import services.emails.EmailDefinitions.allEmailDefinitions
Expand Down Expand Up @@ -59,13 +60,13 @@ class AdminController(
pdfService: PDFService,
emailConfiguration: EmailConfiguration,
taskConfiguration: TaskConfiguration,
reportFileOrchestrator: ReportFileOrchestrator,
companyRepository: CompanyRepositoryInterface,
emailNotificationOrchestrator: EmailNotificationOrchestrator,
ipBlackListRepository: IpBlackListRepositoryInterface,
albertClassificationRepository: AlbertClassificationRepositoryInterface,
albertService: AlbertService,
sampleDataService: SampleDataService,
subcategoryLabelRepository: SubcategoryLabelRepositoryInterface,
implicit val frontRoute: FrontRoute,
authenticator: Authenticator[User],
controllerComponents: ControllerComponents
Expand Down Expand Up @@ -213,7 +214,10 @@ class AdminController(
} yield ()
}

private def _sendReportAckToConsumer(reportsMap: Map[Report, List[ReportFile]]) = {
private def _sendReportAckToConsumer(
reportsMap: Map[Report, List[ReportFile]],
subcategoryLabels: List[SubcategoryLabel]
) = {
val reports = reportsMap.keys.toList
for {
events <- eventRepository.fetchEventsOfReports(reports)
Expand All @@ -223,12 +227,15 @@ class AdminController(
val maybeCompany = report.companyId.flatMap(companyId => companies.find(_.id == companyId))
val event =
events.get(report.id).flatMap(_.find(_.action == Constants.ActionEvent.EMAIL_CONSUMER_ACKNOWLEDGMENT))
val subcategoryLabel =
subcategoryLabels.find(sl => sl.category == report.category && sl.subcategories == report.subcategories)

event match {
case Some(evt) =>
Some(
ConsumerReportAcknowledgment.Email(
report,
subcategoryLabel,
maybeCompany,
evt,
reportAttachements,
Expand All @@ -244,19 +251,35 @@ class AdminController(
} yield ()
}

private def _sendReportToDgccrfIfNeeded(
reportsMap: Map[Report, List[ReportFile]],
subcategoryLabels: List[SubcategoryLabel]
) = {
val reports = reportsMap.keys.toList

reports.traverse { report =>
val subcategoryLabel =
subcategoryLabels.find(sl => sl.category == report.category && sl.subcategories == report.subcategories)
emailNotificationOrchestrator.notifyDgccrfIfNeeded(report, subcategoryLabel)
}
}

def resend(start: OffsetDateTime, end: OffsetDateTime, emailType: ResendEmailType) =
SecuredAction.andThen(WithRole(UserRole.SuperAdmin)).async { implicit request =>
for {
reports <- reportRepository.getReportsWithFiles(
Some(request.identity),
ReportFilter(start = Some(start), end = Some(end))
)
reportsList = reports.keys.toList
subcategoryLabels <- reportsList
.traverse(report => subcategoryLabelRepository.get(report.category, report.subcategories))
.map(_.flatten)
_ <- emailType match {
case ResendEmailType.NewReportAckToConsumer => _sendReportAckToConsumer(reports.toMap)
case ResendEmailType.NewReportAckToPro => _sendNewReportToPro(reports.keys.toList)
case ResendEmailType.NotifyDGCCRF =>
Future.sequence(reports.keys.map(emailNotificationOrchestrator.notifyDgccrfIfNeeded))
case ResendEmailType.ReportProResponse => _sendProAckToConsumer(reports.keys.toList)
case ResendEmailType.NewReportAckToConsumer => _sendReportAckToConsumer(reports.toMap, subcategoryLabels)
case ResendEmailType.NewReportAckToPro => _sendNewReportToPro(reportsList)
case ResendEmailType.NotifyDGCCRF => _sendReportToDgccrfIfNeeded(reports.toMap, subcategoryLabels)
case ResendEmailType.ReportProResponse => _sendProAckToConsumer(reportsList)
}
} yield NoContent
}
Expand Down
17 changes: 11 additions & 6 deletions app/controllers/ReportController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -273,21 +273,26 @@ class ReportController(
SecuredAction.andThen(WithRole(UserRole.AdminsAndReadOnly)).async { implicit request =>
for {
maybeReportWithMetadata <- reportRepository.getFor(Some(request.identity), uuid)
maybeReport = maybeReportWithMetadata.map(_.report)
company <- maybeReport.flatMap(_.companyId).flatTraverse(r => companyRepository.get(r))
company <- maybeReportWithMetadata.flatMap(_.report.companyId).flatTraverse(r => companyRepository.get(r))
files <- reportFileRepository.retrieveReportFiles(uuid)
events <- eventsOrchestrator.getReportsEvents(
reportId = uuid,
eventType = None,
user = request.identity
)
proResponseEvent = events.find(_.data.action == REPORT_PRO_RESPONSE)
source = maybeReport
.map { report =>
val lang = Lang(report.lang.getOrElse(Locale.FRENCH))
source = maybeReportWithMetadata
.map { reportWithMetadata =>
val lang = Lang(reportWithMetadata.report.lang.getOrElse(Locale.FRENCH))
implicit val messagesProvider: MessagesProvider = MessagesImpl(lang, controllerComponents.messagesApi)
val notificationHtml =
views.html.mails.consumer.reportAcknowledgment(report, company, files, isPDF = true)(
views.html.mails.consumer.reportAcknowledgment(
reportWithMetadata.report,
reportWithMetadata.subcategoryLabel,
company,
files,
isPDF = true
)(
frontRoute,
messagesProvider
)
Expand Down
3 changes: 2 additions & 1 deletion app/loader/SignalConsoApplicationLoader.scala
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,7 @@ class SignalConsoComponents(
companySyncService,
engagementRepository,
engagementOrchestrator,
subcategoryLabelRepository,
messagesApi
)

Expand Down Expand Up @@ -766,13 +767,13 @@ class SignalConsoComponents(
pdfService,
emailConfiguration,
taskConfiguration,
reportFileOrchestrator,
companyRepository,
emailNotificationOrchestrator,
ipBlackListRepository,
albertClassificationRepository,
albertService,
sampleDataService,
subcategoryLabelRepository,
frontRoute,
cookieAuthenticator,
controllerComponents
Expand Down
17 changes: 11 additions & 6 deletions app/orchestrators/EmailNotificationOrchestrator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import cats.implicits.toTraverseOps
import models.report.Report
import models.report.ReportTag
import play.api.Logger
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subscription.SubscriptionRepositoryInterface
import services.emails.EmailDefinitionsDggcrf.DgccrfDangerousProductReportNotification
import services.emails.EmailDefinitionsDggcrf.DgccrfPriorityReportNotification
Expand All @@ -24,13 +25,17 @@ class EmailNotificationOrchestrator(mailService: MailService, subscriptionReposi
tag == ReportTag.ProduitDangereux || tag == ReportTag.BauxPrecaire || tag == ReportTag.Shrinkflation
)

private def getNotificationEmail(report: Report): Option[Seq[EmailAddress] => BaseEmail] = {
private def getNotificationEmail(
report: Report,
subcategoryLabel: Option[SubcategoryLabel]
): Option[Seq[EmailAddress] => BaseEmail] = {
val maybeTag = shouldNotifyDgccrf(report)

maybeTag match {
case Some(ReportTag.ProduitDangereux) => Some(DgccrfDangerousProductReportNotification.Email(_, report))
case Some(tag) => Some(DgccrfPriorityReportNotification.Email(_, report, tag.translate()))
case None => None
case Some(ReportTag.ProduitDangereux) =>
Some(DgccrfDangerousProductReportNotification.Email(_, report, subcategoryLabel))
case Some(tag) => Some(DgccrfPriorityReportNotification.Email(_, report, subcategoryLabel, tag.translate()))
case None => None
}
}

Expand Down Expand Up @@ -67,8 +72,8 @@ class EmailNotificationOrchestrator(mailService: MailService, subscriptionReposi
}
}

def notifyDgccrfIfNeeded(report: Report): Future[Unit] =
getNotificationEmail(report) match {
def notifyDgccrfIfNeeded(report: Report, subcategoryLabel: Option[SubcategoryLabel]): Future[Unit] =
getNotificationEmail(report, subcategoryLabel) match {
case Some(email) =>
for {
ddEmails <- getDDEmails(report)
Expand Down
25 changes: 20 additions & 5 deletions app/orchestrators/ReportOrchestrator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import repositories.report.ReportRepositoryInterface
import repositories.reportmetadata.ReportMetadataRepositoryInterface
import repositories.socialnetwork.SocialNetworkRepositoryInterface
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subcategorylabel.SubcategoryLabelRepositoryInterface
import repositories.user.UserRepositoryInterface
import repositories.website.WebsiteRepositoryInterface
import services.emails.EmailDefinitionsConsumer.ConsumerProResponseNotification
Expand Down Expand Up @@ -95,6 +96,7 @@ class ReportOrchestrator(
companySyncService: CompanySyncServiceInterface,
engagementRepository: EngagementRepositoryInterface,
engagementOrchestrator: EngagementOrchestrator,
subcategoryLabelRepository: SubcategoryLabelRepositoryInterface,
messagesApi: MessagesApi
)(implicit val executionContext: ExecutionContext) {
val logger = Logger(this.getClass)
Expand Down Expand Up @@ -346,13 +348,14 @@ class ReportOrchestrator(
reportCreationDate,
expirationDate
)
report <- reportRepository.create(reportToCreate)
report <- reportRepository.create(reportToCreate)
maybeSubcategoryLabel <- subcategoryLabelRepository.get(report.category, report.subcategories)
_ = logger.debug(s"Created report with id ${report.id}")
_ <- createReportMetadata(draftReport, report, consumerIp)
files <- reportFileOrchestrator.attachFilesToReport(draftReport.fileIds, report.id)
updatedReport <- notifyProfessionalIfNeeded(maybeCompany, report)
_ <- emailNotificationOrchestrator.notifyDgccrfIfNeeded(updatedReport)
_ <- notifyConsumer(updatedReport, maybeCompany, files)
_ <- emailNotificationOrchestrator.notifyDgccrfIfNeeded(updatedReport, maybeSubcategoryLabel)
_ <- notifyConsumer(updatedReport, maybeSubcategoryLabel, maybeCompany, files)
_ = logger.debug(s"Report ${updatedReport.id} created")
} yield updatedReport

Expand Down Expand Up @@ -384,7 +387,12 @@ class ReportOrchestrator(
baseDate.plus(delay)
}

private def notifyConsumer(report: Report, maybeCompany: Option[Company], reportAttachements: List[ReportFile]) = {
private def notifyConsumer(
report: Report,
maybeSubcategoryLabel: Option[SubcategoryLabel],
maybeCompany: Option[Company],
reportAttachements: List[ReportFile]
) = {
val event = Event(
UUID.randomUUID(),
Some(report.id),
Expand All @@ -396,7 +404,14 @@ class ReportOrchestrator(
)
for {
_ <- mailService.send(
ConsumerReportAcknowledgment.Email(report, maybeCompany, event, reportAttachements, messagesApi)
ConsumerReportAcknowledgment.Email(
report,
maybeSubcategoryLabel,
maybeCompany,
event,
reportAttachements,
messagesApi
)
)
_ <- eventRepository.create(event)
} yield ()
Expand Down
17 changes: 16 additions & 1 deletion app/services/emails/EmailDefinitionsConsumer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import play.api.i18n.MessagesApi
import play.api.i18n.MessagesImpl
import play.api.i18n.MessagesProvider
import play.api.libs.mailer.Attachment
import repositories.subcategorylabel.SubcategoryLabel
import services.AttachmentService
import services.emails.EmailCategory.Consumer
import services.emails.EmailsExamplesUtils._
Expand Down Expand Up @@ -52,6 +53,7 @@ object EmailDefinitionsConsumer {
"report_ack" -> ((recipient, messagesApi) =>
Email(
genReport.copy(email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -62,6 +64,7 @@ object EmailDefinitionsConsumer {
((recipient, messagesApi) =>
Email(
genReport.copy(status = ReportStatus.NA, tags = List(ReportTag.ReponseConso), email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -72,6 +75,7 @@ object EmailDefinitionsConsumer {
((recipient, messagesApi) =>
Email(
genReport.copy(tags = List(ReportTag.LitigeContractuel), email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -86,6 +90,7 @@ object EmailDefinitionsConsumer {
tags = List(ReportTag.ProduitDangereux, ReportTag.BauxPrecaire),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -100,6 +105,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Italie)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -115,6 +121,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Islande)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -129,6 +136,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Andorre)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -144,6 +152,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Andorre)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -158,6 +167,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Suisse)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -172,6 +182,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Suisse)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -186,6 +197,7 @@ object EmailDefinitionsConsumer {
email = recipient,
tags = List(ReportTag.CompagnieAerienne)
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -200,6 +212,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Bahamas)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -214,6 +227,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Bahamas)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -224,6 +238,7 @@ object EmailDefinitionsConsumer {

final case class Email(
report: Report,
subcategoryLabel: Option[SubcategoryLabel],
maybeCompany: Option[Company],
event: Event,
files: Seq[ReportFile],
Expand All @@ -237,7 +252,7 @@ object EmailDefinitionsConsumer {

override def getBody: (FrontRoute, EmailAddress) => String = (frontRoute, _) =>
views.html.mails.consumer
.reportAcknowledgment(report, maybeCompany, files.toList)(frontRoute, messagesProvider)
.reportAcknowledgment(report, subcategoryLabel, maybeCompany, files.toList)(frontRoute, messagesProvider)
.toString

override def getAttachements: AttachmentService => Seq[Attachment] =
Expand Down
Loading