Open Mon - Fri 10:00-17:00
Status Contact Us Schedule a Call > Click Here

마젠토 2에서 Salable 수량을 얻는 방법

마젠토 2.3 공개 때 처음 도입된 기능인 판매 가능 수량이란 개념이 있습니다. 아주 작은 칼럼이 인벤토리 옆에 하나 추가가 된거지만, 사실 이 기능으로 인해 마젠토 2가 엔터프라이즈 비즈니스에 좀 더 탁월하게 대응할 수 있게 되었습니다.

오늘은 Salable 수량을 별도로 얻는 방법을 통해 전체 인벤토리 현황과 특정 제품들이 솔드아웃 처리되는걸 모니터링 할 수 있는 간단한 코드를 소개해드립니다.

Salable 수량의 도입으로 인해 마젠토 2는 이제 주문이 들어왔을 때 제품의 인벤토리 수량이 줄지 않게 됩니다. 인벤토리 수는 줄지 않고 Salable 수에서 차감이 됩니다. 그리고 실제 인벤토리는 배송이 된 후 차감되게 됩니다. 이런 이유로 다음과 같은 현상이 발생합니다.

  1. 인벤토리 수량과 Salable 수량이 같지 않게 됩니다.
  2. 추가 인벤토리 입고가 이루어졌지만, 이미 접수된 주문이 배송 처리가 되지 않을 경우 여전히 Salable 수량은 -로 표기될 수 있습니다.
  3. 실제 인벤토리가 있음에도 Salable 수가 0이 되면서 사이트에서는 품절 처리가 됩니다. 구글 쇼핑을 이용하는 경우 이 때 문제가 발생됩니다. 마젠토 2의 다양한 데이타 피드를 만드는 방식에서 인벤토리를 Salable 수량이 아닌 Inventory 수량으로 작성되기 때문입니다.

특히 3번은 구글 쇼핑 리스팅과 광고시 심각한 문제를 일으킬 수 있습니다. 구글측에서 정책 위반으로 더 이상 쇼핑 광고 등을 못하게 막는 경우까지 있는데, 이유는 Feed 상에는 인벤토리가 있지만, 실제 사이트에서는 Salable 수량 문제로 솔드 아웃으로 표기될 수 있기 때문입니다.

3번 문제는 별도 커스텀 스크립트를 통해 Salable Qty를 구글이나 페이스북 등 Feed 작성할 때 Inventory Qty로 별도 맵핑해서 해결을 하면 됩니다.

사실 Salable Qty 개념은 중소 규모 커머스 환경에서 반드시 필요한 기능은 아닙니다. 대신 글 서두에 밝혔듯이 엔터프라이즈 환경에서는 중요한 개념인데, 가령 여러 웨어하우스에 분산되어 인벤토링 되어 있는 제품이 있고, 해당 제품의 온라인 판매가 1분당 수십껀이 될 경우에는 이 Salable 수량 개념이 없을 경우 대량 주문 취소등으로 이어질 수 있기 때문입니다.

또 여러가지 문제로 특정 주문의 배송 처리시 배송을 홀드하거나 하는 문제가 있는데, 이렇게 예약된 Salable Qty가 없을 경우, 해당 주문 처리를 위해 다른 문제를 해결한 후 실제 배송시 물건이 없는 경우 또한 발생할 수 있습니다.

마젠토 2에서 간단하게 Salable 수량을 파악할 수 있는 코드를 소개합니다. 이 코드를 통해 Salable 수량이 0인 경우에도 재고에 수량 가용성을 표시할 수 있습니다.

app\code\Vendor\Extension\Helper\Data.php 등 관련 익스텐션 작업시 본문 하단에 별도 표기 된 아래 코드를 추가합니다.

마젠토 2.3으로 업그레이드 할 때 Salable Qty 관련 이슈가 실제 굉장히 많았지만 이제는 몇번의 패치로 인해 대부분의 오작동 버그 등이 해결되었습니다.

다른 엔트리 레벨 플랫폼에서 마젠토로 마이그레이션 할 때 이 Salable Qty 때문에, 혼란이 있는 경우들이 많은데, 이거 하나만 기억하시면 됩니다. “Salable Qty는 판매 가능 수량이고 실제 배송 처리까지 완료되는 경우 인벤토리에서 해당 재고 수량이 빠지게 된다.”

<?php

namespace Vendor\Extension\Helper;

use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\InventorySalesAdminUi\Model\GetSalableQuantityDataBySku;

class Data extends AbstractHelper
{
private $getSalableQtyDataBySku;

public function __construct(
Context $context,
GetSalableQuantityDataBySku $getSalableQtyDataBySku
){
$this->getSalableQtyDataBySku = $getSalableQtyDataBySku;
parent::__construct($context);
}

public function getSalableQtyBySku($sku)
{
$salable = $this->getSalableQuantityDataBySku->execute($sku);
return json_encode($salable);
}
}

그리고 다음 예제 코드 방식으로 결과 값을 얻을 수 있습니다.

[{"stock_name":"Default Stock","qty":100,"manage_stock":true}]

Leave a Reply