Пошаговая инструкция
Списание нужно, когда товар должен уйти из полезного остатка: испортился, истек срок годности, был поврежден, потерян или выявлен при инвентаризационной корректировке. Это не поставка, не transfer, не продажа и не оплата. Правильное списание уменьшает нужный склад и сохраняет понятную причину потери.
Сначала пройдите walkthrough. Точки показывают, куда нажимать; видео показывают Add, раскрытие списков, ввод комментария, поиск товара, выбор Roma Tomato, ввод Gross/Net, добавление строки и Save.
Что заполнить на этом экране
Список Write-offs
Как заполнять: Откройте Write-offs и проверьте существующие строки перед добавлением нового документа.
Зачем: Дубли списаний уменьшают остаток повторно и ломают отчеты по потерям.
Add
Как заполнять: Нажмите Add в правом верхнем углу.
Зачем: Кнопка открывает форму нового документа списания и создает ID документа.
Дата списания
Как заполнять: Проверьте дату и время фактической потери.
Зачем: Складская история, аудит и отчеты должны попадать в правильный период.
From warehouse
Как заполнять: Выберите склад, с которого товар должен уйти.
Зачем: Именно этот склад уменьшится после сохранения.
Reason
Как заполнять: Выберите контролируемую причину: испорченный продукт, просрочка, бой, инвентаризационная корректировка и т.п.
Зачем: Причина делает потерю объяснимой для менеджера, отчетов и будущих AI-агентов.
Comment
Как заполнять: Введите короткий комментарий, что произошло и почему товар нельзя использовать.
Зачем: Комментарий помогает понять контекст без открытия каждой товарной строки.
Select product
Как заполнять: Откройте выбор товара, найдите позицию по названию и выберите точную строку.
Зачем: Только реальная строка товара или ингредиента корректно меняет складской остаток.
Gross
Как заполнять: Введите физическое количество, которое проверили или сняли со склада.
Зачем: Gross показывает общий объем, связанный с потерей.
Net
Как заполнять: Введите количество, которое должно считаться фактическим уменьшением полезного остатка.
Зачем: При порче, усушке или обрезке Net может отличаться от Gross.
Add line
Как заполнять: Нажмите Add после выбора товара и количества.
Зачем: Пока строка не добавлена, товар не входит в документ списания.
Save
Как заполнять: Сохраняйте только после проверки даты, склада, причины, комментария и строк товаров.
Зачем: Только сохраненное списание становится надежной складской историей.
Проверка строки
Как заполнять: Вернитесь в Write-offs и проверьте дату, тип, склад, причину, содержимое и комментарий.
Зачем: Так видно, что запись действительно записана и загружена обратно из базы.
Частые ошибки
- Сохранять списание без добавленных товарных строк.
- Выбирать неверный склад и уменьшать остаток в неправильной локации.
- Использовать слишком общую причину, которая не объясняет потерю.
- Оставлять комментарий пустым или не связанным с реальным событием.
- Выбирать похожий товар без поиска и проверки точной строки.
- Вводить количество в другой единице, чем указано у товара.
- Путать Gross и Net при порче, усушке, обрезке или частичном восстановлении.
- Считать списание поставкой, transfer, продажей или финансовой оплатой.
- Править write_offs напрямую в Supabase и не обновлять loadwriteoff, loadstorage и loadproduct.
- Использовать type '=' для списания: '=' относится к transfer, для списаний нужен type '-'.
Техническая таблица для AI-агентов
Этот блок расположен ниже пользовательской инструкции. Он нужен поддержке, автоматизациям и будущим AI-агентам, которые будут объяснять списания, проверять складскую историю и связывать документы с реальными полями базы.
| Поле | Хранится как | Назначение | Почему важно |
|---|---|---|---|
| ID списания | write_offs.id / WriteOffStruct.ID | Уникальный ID документа списания. | Нужен для истории склада, поддержки, отчетов, аудита, импортов и AI-агентов. |
| Тип документа | write_offs.type = "-" | Маркер документа, который уменьшает остаток. | Списания и transfer используют таблицу write_offs, поэтому тип '-' отделяет потерю от перемещения. |
| Компания | write_offs.company | Компания, которой принадлежит списание. | Не дает складским документам смешиваться между компаниями. |
| Дата списания | write_offs.date / WriteOffStruct.Date | Дата и время события списания. | Используется в истории склада, отчетах по потерям, сменной сверке и аудите. |
| From warehouse | write_offs.storage / WriteOffStruct.Storage | ID склада, где уменьшается остаток. | Это склад, из которого товар списывается. |
| Reason | write_offs.reasons / WriteOffStruct.Reasons | Объект причины из справочника write_off_reasons. | Объясняет, почему товар убрали из полезного остатка. |
| Comment | write_offs.comment / WriteOffStruct.Comment | Короткая операционная заметка. | Поясняет порчу, просрочку, бой, корректировку или другой реальный контекст. |
| Items | write_offs.items[] / WriteOffStruct.Items[] | Список товаров или ингредиентов, которые списываются. | Без строк товаров документ не может корректно изменить склад. |
| ID строки | write_offs.items[].ID | Уникальный ID товарной строки. | Позволяет ссылаться на конкретное движение товара в аудите, поддержке и AI-объяснениях. |
| Дата строки | write_offs.items[].date | Дата движения на уровне строки. | Синхронизирует строку товара с датой документа. |
| Тип движения строки | write_offs.items[].Type = - | Направление складского движения. | Минус означает уменьшение остатка. |
| Product | write_offs.items[].Product | ID товара, ингредиента, упаковки, полуфабриката, модификатора или техкарты. | Это конкретная номенклатура, чей остаток уменьшается. |
| Specification / variant | write_offs.items[].specifications | Опциональные ID спецификаций или вариантов. | Заполняется только для товаров с контролируемыми вариантами. |
| Gross | write_offs.items[].Gross | Физическое количество до потерь или корректировок. | Показывает, сколько товара проверили или сняли со склада. |
| Net | write_offs.items[].Net | Количество, которое считается фактической потерей полезного остатка. | Для порчи или обрезки Net может быть меньше Gross. |
| Единица | products.unit_of_measurement | Единица выбранного товара: kg, pcs, l, oz, pack и т.п. | Количество без единицы невозможно правильно интерпретировать. |
| Storage в строке | write_offs.items[].Storage | ID склада, записанный на товарной строке. | Связывает строку с локацией, где изменился остаток. |
| Reason в строке | write_offs.items[].Reasion | ID причины на уровне строки. | Сохраняет причину при отдельном анализе товарных строк. |
| Comment в строке | write_offs.items[].Comment | Заметка по конкретной строке. | Полезна, если в одном документе несколько товаров с разными деталями потери. |
| Price | write_offs.items[].Price | Цена единицы, если она используется. | Может применяться для оценки стоимости потерь. |
| Line amount | write_offs.items[].amount | Стоимость строки, если рассчитывается. | Помогает будущим отчетам по стоимости списаний. |
| Document amount | write_offs.amount | Общая сумма списания, если рассчитывается. | Может использоваться для финансового анализа потерь. |
| Created at | write_offs.created_at | Время создания записи. | Нужно для диагностики, аудита и поддержки. |
| User | write_offs.user | Пользователь, создавший документ, если поле заполнено. | Поддерживает ответственность и аудит. |
| Кэш приложения | FFAppState().Writeoff | Клиентский список документов списания. | После backend-правок приложение должно перезагрузить write_offs. |
| Маркеры обновления | company.loadwriteoff / loadstorage / loadproduct | Timestamp-маркеры для обновления списаний, складов и товаров. | Нужны, чтобы формы и списки увидели актуальные данные. |