OpenCart 是用下圖的設定,來認定訂單是否完成,當訂當狀態從不是[屬處理中之訂單狀態]或[屬已完成之訂單狀態],變更成[屬處理中之訂單狀態]或[屬已完成之訂單狀態]時,就代表這張訂單從未完成變成已完成的一個觸發訊號,當這個觸發訊號出現時,系統就會根據訂單內容扣除商品庫存數(代表已確定售出),如果訂單有使用折價券,就會將折價券的可使用數量減一,如果訂單有使用購物金支付,則會從會員的購物金餘額扣除這筆購物金,其他還有紅利點數、禮券、推薦獎金等等,都是透過這個觸發訊號來啟動扣減動作的。
但是這樣的機制設計,會使得所有的項目(包括庫存數、紅利點數、購物金等等)的觸發時機強制一致,可是商家有時候卻有不同步的需求,例如希望訂單完成後才扣減庫存數,以免訂單未付款卻把庫存額度用掉,但又同時希望一下單就扣減購物金,免得一筆購物金被用在多筆訂單上,為了這個需求,我們開發了這套購物金預扣模組,可以達到購物金預扣的功能,避免同一筆購物金被用在多筆訂單上,若要改成預扣紅利點數或是折價券,也是可以的,請跟我們聯絡。
預扣購物金的設計邏輯
這裡分享我們是如何設計預扣購物金的程式邏輯,做法並不是只有我們分享的這一種,你也可以自行發展自己的預扣機制。
如果系統有啟用購物金功能,並且會員的購物金中尚有餘額時,在一頁式結帳進入結帳畫面,或是系統內建的購物車頁面,都可以在購物清單區塊下方的小計區域,看到購物金被抵用的資訊。
上圖的案例中,因為結帳程式會呼叫 account 的 getTotalAmount() 來查詢會員的購物金餘額,如果會員在之前有下過訂單且含購物金扣抵,並且訂張狀態尚未達到訂單完成狀態,就不會有該筆購物金的使用紀錄,呼叫 getTotalAmount() 所得到的購物金餘額,也不會含該次的購物金使用,所以需要在這個時候增加一些程式,去計算那些雖然未達到訂單完成狀態,但仍需先扣減掉購物金的訂單所使用的購物金金額。
設定那些訂單狀態必須預扣購物金
為了讓前述的程式能計算預扣的購物金金額,我們必須提供商家能指定那些訂單狀態必須要預扣購物金,所以在商店管理中,我們增加了下圖的設定:
於是我們就可以依據這裡的設定,去讀取該會員的訂單,過濾屬於該預扣購物金的訂單狀態的訂單,加總這些訂單使用購物金的總額,就是應該預扣下來的額度,並修改程式,當呼叫 getTotalAmount() 得到會員的購物金額餘額之後,再扣減前面的預扣總額,如此就可以得的含有預扣的購物金餘額,避免購物金被不當的超用。
在加上預扣購物金功能之前,系統是允許可以超支購物金去下單,不過當超支購物金的訂單完成後,會員的購物金餘額就會變成負值,如果你的網站與允許這種情形,那麼就不需要安裝這種預扣購物金的模組了。