Сначала необходимо определить «день, когда количество товара на складе равно 0», потому что количество может сильно измениться в течение дня из-за движения запасов. Это может быть «количество в наличии равно 0 в каждую минуту дня» или «количество в наличии равно 0 в 23:59:59 дня».
Я думаю, что есть два подхода:
- Рассчитайте количество под рукой, используя
stock.move
на временной шкале и посмотрите, сколько 0. Это хорошо работает, если вы хотите использовать вычислительную мощность для замены дискового пространства и если вы хотите сделать отчет сейчас, используя существующие данные. - Создайте новую модель для хранения количества под рукой из
stock.quant
с указанием c время суток. Это легче кодировать, но работает только для будущих отчетов и не работает хорошо, если вам нужно проверять несколько временных точек в день.
Для первого подхода вы можете сделать SQL, чтобы получить количество в наличии в , заданное c момент времени , рассчитанное по stock.move
.
Если вам не важно местоположение и вам просто нужно количество в наличии, сгруппированное по продуктам:
WITH AGG AS
(SELECT stock_move.product_id AS "PP",
ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
FROM stock_move
LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id
WHERE product_template.type = 'product'
AND stock_move.state = 'done'
AND date <= '2020-01-01 07:00:00'
UNION
ALL
SELECT stock_move.product_id AS "PP",
- ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
FROM stock_move
LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id WHERE product_template.type = 'product'
AND stock_move.state = 'done'
AND date <= '2020-01-01 07:00:00' ),
CALC AS
(SELECT AGG."PP",
sum(AGG."Base_Qty_Done") "Base QoH"
FROM AGG
GROUP BY AGG."PP")
SELECT product_product.default_code "Reference",
CALC."Base QoH" "Qty Calculated From Stock Move",
uom_category.name "Base UoM Of"
FROM CALC
LEFT OUTER JOIN product_product ON product_product.id = CALC."PP"
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON product_template.uom_id = uom_uom.id
LEFT OUTER JOIN uom_category ON uom_category.id = uom_uom.category_id
WHERE CALC."Base QoH" = 0
ORDER BY CALC."PP"
Если вам нужно количество под рукой для каждого продукта на местоположение:
WITH AGG AS
(SELECT stock_move.product_id AS "PP",
stock_move.location_dest_id AS "Loc",
ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
FROM stock_move
LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id
WHERE product_template.type = 'product'
AND stock_move.state = 'done'
AND date <= '2020-01-01 07:00:00'
UNION
ALL
SELECT stock_move.product_id AS "PP",
stock_move.location_id AS "Loc", - ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
FROM stock_move
LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id WHERE product_template.type = 'product'
AND stock_move.state = 'done'
AND date <= '2020-01-01 07:00:00' ),
CALC AS
(SELECT AGG."PP",
AGG."Loc",
sum(AGG."Base_Qty_Done") "Base QoH"
FROM AGG
GROUP BY AGG."PP",
AGG."Loc")
SELECT product_product.default_code "Reference",
stock_location.name "Location",
CALC."Base QoH" "Qty Calculated From Stock Move",
uom_category.name "Base UoM Of"
FROM CALC
LEFT OUTER JOIN product_product ON product_product.id = CALC."PP"
LEFT OUTER JOIN stock_location ON stock_location.id = CALC."Loc"
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON product_template.uom_id = uom_uom.id
LEFT OUTER JOIN uom_category ON uom_category.id = uom_uom.category_id
WHERE CALC."Base QoH" = 0
ORDER BY CALC."PP"
Измените все '2020-01-01 07:00:00'
в запросе на желаемый момент времени и повторите для всех точек на вашей шкале времени ( если только один раз, вы можете вручную составить отчет с помощью SQL и Excel, если нет, напишите какой-нибудь код).
Для второго подхода - запрос количества в наличии на один продукт на местоположение это просто.
SELECT stock_quant.product_id "PP ID",
stock_quant.location_id "Location ID",
Sum(stock_quant.quantity) "QoH"
FROM stock_quant
GROUP BY stock_quant.location_id,
stock_quant.product_id
Вам понадобится написать новую модель с задачей schedueld для хранения данных с заданным интервалом.
Я бы порекомендовал метод 1, это больше работы но использует меньше места на диске, и вы можете o отчеты за любой период времени, включая прошлое.