Go · 57 строк
Каждый понедельник утром отчёт считает выплату продавцу за прошлую неделю с понедельника 00:00 до воскресенья 24:00 по Москве: продажи минус возвраты, комиссия 15,5 % от продаж и логистика. Если вышел минус, он переносится долгом на следующую неделю.
Активных продавцов 80 тыс. Отчёт иногда перезапускают вручную в воскресенье вечером. Серверы и база в UTC, sold_at — timestamptz. Отметьте строки с ошибками.
В работе: Финансовый отчёт в кабинете продавца и платёжное поручение на выплату по понедельникам.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Wildberries: отчёт и выплаты продавцам. Условие пересказано своими словами.
Давали на собеседовании?
package payoutimport ("context""database/sql""math""time")type Line struct {SellerID int64Sales float64Returns float64Commission float64Logistics float64Payout float64}const commissionRate = 0.155// WeeklyReport собирает выплату продавцам за прошлую неделю (пн 00:00 — вс 24:00 МСК).func WeeklyReport(ctx context.Context, db *sql.DB, now time.Time) ([]Line, error) {weekday := int(now.Weekday())monday := now.AddDate(0, 0, -weekday-6)start := monday.Truncate(24 * time.Hour)end := start.AddDate(0, 0, 7)sellers, err := db.QueryContext(ctx, "SELECT id FROM sellers WHERE active")if err != nil {return nil, err}defer sellers.Close()var report []Linefor sellers.Next() {var l Linesellers.Scan(&l.SellerID)err := db.QueryRowContext(ctx,"SELECT coalesce(sum(price), 0) FROM sales WHERE seller_id = $1 AND sold_at BETWEEN $2 AND $3",l.SellerID, start, end).Scan(&l.Sales)if err != nil {return nil, err}db.QueryRowContext(ctx,"SELECT coalesce(sum(price), 0) FROM returns WHERE seller_id = $1 AND returned_at >= $2 AND returned_at < $3",l.SellerID, start, end).Scan(&l.Returns)db.QueryRowContext(ctx, "SELECT coalesce(sum(cost), 0) FROM logistics WHERE seller_id = $1 AND week_start = $2",l.SellerID, start).Scan(&l.Logistics)l.Commission = l.Sales * commissionRatel.Payout = math.Round(l.Sales - l.Returns - l.Commission - l.Logistics)if l.Payout < 0 {l.Payout = 0}report = append(report, l)}return report, nil}