правки
This commit is contained in:
@@ -32,62 +32,164 @@ func (s *PlacementDetails) renderDetails(b *bot.Bot, mode bot.RenderMode) {
|
||||
|
||||
text := "<b>Детали размещения</b>\n\n"
|
||||
|
||||
channelName := formatChannelName(placement.Channel)
|
||||
text += fmt.Sprintf("• <b>Канал:</b> %s\n", channelName)
|
||||
text += fmt.Sprintf("• <b>Статус:</b> %s\n", formatPlacementStatus(placement.Status))
|
||||
text += fmt.Sprintf("• <b>Ссылка:</b> %s\n", formatInviteLinkType(placement.InviteLinkType))
|
||||
// Размещение в канале
|
||||
text += "📺 <b>Размещение в канале:</b>\n"
|
||||
text += formatChannelWithName(placement.Channel)
|
||||
text += "\n"
|
||||
|
||||
// Рекламируемый проект
|
||||
if placement.Project != nil {
|
||||
text += "🎯 <b>Рекламируемый проект:</b>\n"
|
||||
text += formatProject(*placement.Project)
|
||||
text += "\n"
|
||||
}
|
||||
|
||||
// Ссылка на пост
|
||||
if placementPost != nil && placementPost.Post.URL != nil && *placementPost.Post.URL != "" {
|
||||
text += fmt.Sprintf("🔗 <b>Ссылка на пост:</b> %s\n", *placementPost.Post.URL)
|
||||
}
|
||||
|
||||
// Пригласительная ссылка
|
||||
if placement.InviteLink != nil && *placement.InviteLink != "" {
|
||||
text += fmt.Sprintf("📩 <b>Пригласительная ссылка:</b> %s\n", *placement.InviteLink)
|
||||
}
|
||||
|
||||
// Тип ссылки
|
||||
text += fmt.Sprintf("🔓 <b>Тип ссылки:</b> %s\n", formatInviteLinkType(placement.InviteLinkType))
|
||||
|
||||
// Порядковый номер размещения
|
||||
if placement.PlacementNumber > 0 {
|
||||
text += fmt.Sprintf("🔢 <b>Размещение №%d</b> в этом канале\n", placement.PlacementNumber)
|
||||
}
|
||||
|
||||
// Креатив
|
||||
if placement.Details != nil && placement.Details.CreativeName != nil && *placement.Details.CreativeName != "" {
|
||||
text += fmt.Sprintf("✨ <b>Креатив:</b> %s\n", *placement.Details.CreativeName)
|
||||
} else if placement.CreativeName != nil && *placement.CreativeName != "" {
|
||||
text += fmt.Sprintf("✨ <b>Креатив:</b> %s\n", *placement.CreativeName)
|
||||
}
|
||||
|
||||
text += "\n"
|
||||
|
||||
// Финансовая информация
|
||||
if placement.Details != nil {
|
||||
if placement.Details.PlacementType != nil {
|
||||
text += fmt.Sprintf("• <b>Тип:</b> %s\n", formatPlacementType(*placement.Details.PlacementType))
|
||||
}
|
||||
if placement.Details.PlacementAt != nil && *placement.Details.PlacementAt != "" {
|
||||
text += fmt.Sprintf("• <b>Дата размещения:</b> %s\n", formatDateTime(*placement.Details.PlacementAt))
|
||||
}
|
||||
if placement.Details.PaymentAt != nil && *placement.Details.PaymentAt != "" {
|
||||
text += fmt.Sprintf("• <b>Дата оплаты:</b> %s\n", formatDateTime(*placement.Details.PaymentAt))
|
||||
}
|
||||
// Стоимость
|
||||
if placement.Details.Cost != nil {
|
||||
text += fmt.Sprintf("• <b>Стоимость:</b> %s %.0f₽\n",
|
||||
formatCostType(placement.Details.Cost.Type),
|
||||
placement.Details.Cost.Value,
|
||||
)
|
||||
costType := formatCostType(placement.Details.Cost.Type)
|
||||
text += fmt.Sprintf("💰 <b>Стоимость:</b> %s %.0f₽\n", costType, placement.Details.Cost.Value)
|
||||
}
|
||||
|
||||
// Стоимость до торга
|
||||
if placement.Details.CostBeforeBargain != nil {
|
||||
text += fmt.Sprintf("• <b>До торга:</b> %s %.0f₽\n",
|
||||
formatCostType(placement.Details.CostBeforeBargain.Type),
|
||||
placement.Details.CostBeforeBargain.Value,
|
||||
)
|
||||
costType := formatCostType(placement.Details.CostBeforeBargain.Type)
|
||||
text += fmt.Sprintf("💸 <b>До торга:</b> %s %.0f₽\n", costType, placement.Details.CostBeforeBargain.Value)
|
||||
}
|
||||
|
||||
// Дата размещения
|
||||
if placement.Details.PlacementAt != nil && *placement.Details.PlacementAt != "" {
|
||||
text += fmt.Sprintf("📅 <b>Дата размещения:</b> %s\n", formatDateTime(*placement.Details.PlacementAt))
|
||||
}
|
||||
|
||||
// Дата оплаты
|
||||
if placement.Details.PaymentAt != nil && *placement.Details.PaymentAt != "" {
|
||||
text += fmt.Sprintf("💳 <b>Дата оплаты:</b> %s\n", formatDateTime(*placement.Details.PaymentAt))
|
||||
}
|
||||
|
||||
// Формат
|
||||
if placement.Details.Format != nil && *placement.Details.Format != "" {
|
||||
text += fmt.Sprintf("• <b>Формат:</b> %s\n", *placement.Details.Format)
|
||||
text += fmt.Sprintf("📐 <b>Формат:</b> %s\n", *placement.Details.Format)
|
||||
}
|
||||
if placement.Details.Comment != nil && *placement.Details.Comment != "" {
|
||||
text += fmt.Sprintf("• <b>Комментарий:</b> %s\n", *placement.Details.Comment)
|
||||
|
||||
// Тип закупа
|
||||
if placement.Details.PlacementType != nil {
|
||||
text += fmt.Sprintf("🔄 <b>Тип закупа:</b> %s\n", formatPlacementType(*placement.Details.PlacementType))
|
||||
}
|
||||
}
|
||||
|
||||
text += "\n"
|
||||
|
||||
// Статистика
|
||||
if placementPost != nil {
|
||||
text += "\n<b>Пост</b>\n"
|
||||
if placementPost.Post.URL != nil && *placementPost.Post.URL != "" {
|
||||
text += fmt.Sprintf("• <b>Ссылка на пост:</b> %s\n", *placementPost.Post.URL)
|
||||
} else {
|
||||
text += "• <b>Ссылка на пост:</b> не найдена\n"
|
||||
// Кол-во подписчиков
|
||||
if placementPost.SubscriptionsCount > 0 {
|
||||
text += fmt.Sprintf("👥 <b>Подписчики:</b> %d\n", placementPost.SubscriptionsCount)
|
||||
}
|
||||
|
||||
// Просмотры поста
|
||||
if placementPost.ViewsCount != nil {
|
||||
text += fmt.Sprintf("👁️ <b>Просмотры:</b> %d\n", *placementPost.ViewsCount)
|
||||
}
|
||||
|
||||
// CPF (стоимость подписчика)
|
||||
if placementPost.SubscriptionsCount > 0 && placement.Details != nil && placement.Details.Cost != nil {
|
||||
cpf := calculateCPF(placement.Details.Cost.Value, placementPost.SubscriptionsCount)
|
||||
text += fmt.Sprintf("💵 <b>CPF:</b> %.2f₽\n", cpf)
|
||||
}
|
||||
|
||||
// Конверсия
|
||||
if placementPost.ViewsCount != nil && *placementPost.ViewsCount > 0 && placementPost.SubscriptionsCount > 0 {
|
||||
conversion := calculateConversion(placementPost.SubscriptionsCount, *placementPost.ViewsCount)
|
||||
text += fmt.Sprintf("📊 <b>Конверсия:</b> %.1f%%\n", conversion)
|
||||
}
|
||||
}
|
||||
|
||||
// Комментарий
|
||||
if placement.Details != nil && placement.Details.Comment != nil && *placement.Details.Comment != "" {
|
||||
text += fmt.Sprintf("\n📝 <b>Комментарий:</b> %s\n", *placement.Details.Comment)
|
||||
}
|
||||
|
||||
keyboard := Keyboard(Row(Button("← Назад", "back")))
|
||||
b.Render(text, keyboard, mode)
|
||||
}
|
||||
|
||||
func formatChannelName(channel backend.Channel) string {
|
||||
func formatChannelWithName(channel backend.Channel) string {
|
||||
var name string
|
||||
if channel.Title != nil && *channel.Title != "" {
|
||||
return *channel.Title
|
||||
name = *channel.Title
|
||||
} else if channel.Username != nil && *channel.Username != "" {
|
||||
name = "@" + *channel.Username
|
||||
} else {
|
||||
name = "Без названия"
|
||||
}
|
||||
|
||||
// Добавляем ссылку если есть username или invite_link
|
||||
if channel.Username != nil && *channel.Username != "" {
|
||||
return "@" + *channel.Username
|
||||
return fmt.Sprintf(" %s (@%s)\n", name, *channel.Username)
|
||||
} else if channel.InviteLink != nil && *channel.InviteLink != "" {
|
||||
return fmt.Sprintf(" %s\n", name)
|
||||
}
|
||||
return "Без названия"
|
||||
return fmt.Sprintf(" %s\n", name)
|
||||
}
|
||||
|
||||
func formatProject(project backend.ProjectOutput) string {
|
||||
var name string
|
||||
if project.Channel.Title != nil && *project.Channel.Title != "" {
|
||||
name = *project.Channel.Title
|
||||
} else if project.Channel.Username != nil && *project.Channel.Username != "" {
|
||||
name = "@" + *project.Channel.Username
|
||||
} else {
|
||||
name = "Без названия"
|
||||
}
|
||||
|
||||
// Добавляем ссылку если есть username
|
||||
if project.Channel.Username != nil && *project.Channel.Username != "" {
|
||||
return fmt.Sprintf(" %s (@%s)\n", name, *project.Channel.Username)
|
||||
}
|
||||
return fmt.Sprintf(" %s\n", name)
|
||||
}
|
||||
|
||||
func calculateCPF(cost float64, subscriptions int) float64 {
|
||||
if subscriptions == 0 {
|
||||
return 0
|
||||
}
|
||||
return cost / float64(subscriptions)
|
||||
}
|
||||
|
||||
func calculateConversion(subscriptions int, views int) float64 {
|
||||
if views == 0 {
|
||||
return 0
|
||||
}
|
||||
return float64(subscriptions) / float64(views) * 100
|
||||
}
|
||||
|
||||
func formatInviteLinkType(value string) string {
|
||||
|
||||
Reference in New Issue
Block a user