FIFO расчёт себестоимости — Полная документация

ИП Галимзянова + Весна | Обновлено: 27.03.2026
4 729
Строк ИП
2 463
Строк Весна
7 192
Итого строк отчёта
мар 2024 — мар 2026
Период данных
73 SKU
Артикулов в неделю

Содержание

1 Источники данных

1.1 Поступления fifo_v2_receipts

База данных
dvorec_analyticspublicfifo_v2_receipts
Источник
Google Sheets «Продажи ИП Галимзянова» (3 вкладки: отгрузки КЗС ИП, отгрузки КЗС Весна, отгрузки 2026)
Поля
entity — организация, receipt_date — дата поступления, sku — артикул, qty — количество, unit_cost — себестоимость за штуку, include_flag — 1=включено в расчёт
Строк
ИП — 3 759 (409 уникальных артикулов), Весна — 363 (84 артикула)
Период
с 2024-02-19 по 2026-03-13
Обновление
Автоматически каждый понедельник 09:00 МСК (fifo_auto_update.py)

1.2 Продажи fifo_v2_sales

База данных
dvorec_analyticspublicfifo_v2_sales
Поля
entity, source, sale_date, sku (артикул), qty_signed (положительное = продажа, отрицательное = возврат)
Строк
ИП — 35 989 (299 артикулов), Весна — 11 934 (87 артикулов)
Период
с 2024-03-07 по 2026-03-22
Обновление
Автоматически каждый понедельник
Источники (5 каналов):
  • wb — WB финотчёт (из таблицы fin_wb), фильтр doc_type IN ('Продажа','Возврат')
  • wb_real — WB реализация (из таблицы wb_realization_report, API reportDetailByPeriod), фильтр doc_type_name IN ('Продажа','Возврат')
  • ozon — Ozon финотчёт (из Google Sheets «ФО для БД»)
  • ym — Яндекс.Маркет (из Google Sheets «ФО для БД»)
  • ke — Купер/Магнит Маркет (из Google Sheets «ФО для БД»)

1.3 BOM расходники fifo_v2_bom

База данных
dvorec_analyticspublicfifo_v2_bom
Источник
Google Sheets «состав расходников»
Суть
При продаже смесителя автоматически списываются расходники (ключ, коробка, удлинитель)
Правил
28 правил: mixer_sku (какой смеситель), consumable_sku (какой расходник), qty_per_1 (сколько штук на 1 смеситель), start_week_end/end_week_end (период действия)
Пример: КС 8217 списать 1 × «Ключ пластиковый для ДС» + 1 × «Короб цветной + пенка для ДС»

1.4 SKU маппинг fifo_v2_sku_mapping

Суть
Некоторые артикулы пишутся по-разному в разных источниках. Маппинг объединяет их в единую группу.
Правил
3 правила на данный момент
Пример
сво кс 203254 дСДВ КС 203254

1.5 Итоговый отчёт fifo_v2_weekly_report

База данных
dvorec_analyticspublicfifo_v2_weekly_report
Тип
Это РЕЗУЛЬТАТ расчёта (не источник данных)
Строк
7 192 (ИП — 4 729, Весна — 2 463)
Период
с 2024-03-10 по 2026-03-22
2 Флаги и фильтрация

include_flag в поступлениях

flag = 1 (TRUE)

Поступление включено в расчёт FIFO. Используется для формирования FIFO-слоёв и расчёта себестоимости.

flag = 0 (FALSE)

Поступление исключено из расчёта. Например, тестовые или ошибочные данные. Хранится в базе, но не участвует в FIFO.

ВАЖНО: В базе данных хранятся ВСЕ данные. Фильтрация flag=1 происходит ТОЛЬКО на этапе расчёта. Сейчас все 4 122 поступления имеют flag=1.

Фильтры продаж

  • Из fin_wb: только doc_type IN ('Продажа', 'Возврат') — исключаются строки комиссий, логистики, хранения
  • Из wb_realization_report: только doc_type_name IN ('Продажа', 'Возврат')
  • Возвраты учитываются с отрицательным qty_signed (уменьшают расход товара)
3 Формула расчёта FIFO

Принцип FIFO (First In — First Out)

Первые поступившие товары продаются первыми. Себестоимость проданного товара равна цене той партии, из которой он был отгружен.

Основная формула:
Себестоимость (COGS) = Сумма по всем партиям: количество_из_партии × цена_партии
Расчёт количества из каждой партии:
sold_from_layer = MIN(qty_in, MAX(0, cum_out_end - cum_in_prev)) - MIN(qty_in, MAX(0, cum_out_start - cum_in_prev))
qty_in
Количество в партии поступления
cum_out_end
Накопительная сумма продаж на конец недели
cum_out_start
Накопительная сумма продаж на начало недели
cum_in_prev
Накопительное поступление ДО этой партии
Дополнительные формулы:
Остаток = Поступления - Продажи (нарастающим итогом) Средняя себестоимость остатка = Стоимость остатка / Количество остатка Непокрытые продажи (uncovered) = MAX(0, Продажи_накопительно - Поступления_накопительно)
4 Пошаговая логика расчёта (6 шагов)
1

Формирование FIFO-слоёв fifo_layers

Берём все поступления из fifo_v2_receipts с flag=1, qty>0, unit_cost>0. Каждая строка = одна партия (слой). Считаем накопительное поступление: cum_in = SUM(qty) по артикулу, упорядоченное по дате.

Результат: таблица партий с накопительными суммами для каждого артикула
2

Агрегация продаж по неделям sales_weekly

Берём все продажи из fifo_v2_sales. Группируем по: entity + артикул + неделя (week_end = ближайшее воскресенье). Суммируем qty_signed → получаем чистые продажи за неделю (продажи минус возвраты).

3

Списание расходников по BOM consumable_outflow

Для каждого смесителя, проданного на Шаге 2, проверяем BOM-таблицу. Если есть правило (например: КС 8217 → Ключ ×1), создаём дополнительный расход расходника. Учитываем период действия правила (start_week_end ≤ week_end ≤ end_week_end).

4

Объединение расходов combined_outflow

Складываем прямые продажи (Шаг 2) и списание расходников (Шаг 3). Считаем накопительный расход (cum_out) по каждому артикулу.

5

FIFO-привязка расходов к партиям calc

Для каждой недели и каждого артикула:

• Берём все партии (Шаг 1) с датой ≤ конец недели
• По формуле FIFO определяем, сколько из каждой партии израсходовано
• Считаем: COGS = кол-во × цена_партии
• Считаем: остаток и его стоимость
6

Итоговый отчёт fifo_v2_weekly_report

Записываем результат в таблицу с колонками:

entity — организация, week_end — конец недели, sku_group — артикул, out_qty — продано, end_qty — остаток, end_value — стоимость остатка, cogs — себестоимость проданного, avg_cogs — средняя себестоимость, uncovered — непокрытые продажи
5 Пример расчёта
СДВ КС 101254
ИП Галимзянова
112
Партий поступлений
7 308
Поступило шт.
~2 249
Продано шт.
2 162,79
Средняя цена, руб.
Поступления
Период
с 2024-02-19 по 2026-03-08 (112 партий)
Всего
7 308 шт., средняя цена: 2 162,79 руб.
Диапазон цен
Первые партии по 2 106 руб., последние по 2 436 руб.
Продажи по каналам
WB (fin_wb)
1 609 шт.
WB (realization)
628 шт.
Ozon
8 шт.
КЭ
4 шт.
Итого
~2 249 шт.
Результат за неделю 22 марта 2026:
Продано: 62 шт. | COGS: 151 032 руб. (62 × 2 436 руб. — по цене последних партий) | Остаток: 5 059 шт. на сумму 12 118 080 руб. | Средняя себестоимость остатка: 2 396 руб. | Непокрытые продажи: 0 (поступлений хватает)
Недельные данные СДВ КС 101254 (последние 8 недель)
Неделя Продано, шт. COGS, руб. Ср. себестоимость Остаток, шт. Стоимость остатка Непокрытые
02.02.2026 58 138 864 2 394 5 149 12 297 900 0
09.02.2026 71 170 556 2 402 5 178 12 437 556 0
16.02.2026 64 153 984 2 406 5 114 12 304 284 0
23.02.2026 55 133 980 2 436 5 159 12 567 324 0
02.03.2026 67 163 212 2 436 5 192 12 647 712 0
09.03.2026 73 177 828 2 436 5 119 12 469 884 0
15.03.2026 60 146 160 2 436 5 059 12 323 724 0
22.03.2026 62 151 032 2 436 5 059 12 118 080 0
Обратите внимание: средняя себестоимость плавно растёт от 2 394 руб. к 2 436 руб. по мере того, как расходуются дешёвые ранние партии и остаток формируется из более дорогих поздних поставок. Это — ключевая особенность метода FIFO.
6 Исправленные проблемы
Проблема 1: Мало строк в отчёте Исправлено 27.03.2026
Было:
512 строк, 4 SKU за неделю
Причина:
Артикулы в поступлениях были в ВЕРХНЕМ регистре (СДВ КС 101254), а в продажах — в нижнем (сдв кс 101254). JOIN не находил совпадений.
Исправление:
Добавлен UPPER() во все JOIN-условия FIFO SQL
Стало:
7 192 строки, 73 SKU за неделю
Проблема 2: Данные только до 1 марта Исправлено 24.03.2026
Было:
FIFO-данные обрывались на 1 марта
Причина:
Таблица wb_realization_report не содержала данных ИП и Весна
Исправление:
Загружено 215 084 строки WB финотчётов для всех 11 кабинетов
Стало:
Данные до 22 марта 2026
7 Как проверить расчёт

Инструкция для проверки (Аня, Фарида)

  1. Зайти в Metabasedvorecmasterov.ru (логин/пароль Metabase)
  2. Открыть таблицу «FIFO — Поступления v2» → проверить свои данные: артикулы, количество, себестоимость за штуку. Убедиться, что все поставки есть в системе.
  3. Открыть таблицу «FIFO — Продажи v2» → убедиться, что продажи подтягиваются из всех каналов (WB, Ozon, YM, KE).
  4. Открыть таблицу «FIFO — Недельный отчёт v2» → найти нужный артикул, проверить что остаток = поступления - продажи.
  5. Для ручной сверки: взять 1 артикул, посчитать вручную по FIFO (первые поступления расходуются первыми) и сравнить с данными таблицы. Если есть расхождение — сообщить.
Совет: Для быстрой проверки возьмите артикул с небольшим количеством партий (3–5 поступлений). Посчитайте вручную, из какой партии списывается каждая продажа, и сравните COGS с таблицей.