---
# System prepended metadata

title: e-commerce 問題與建議
tags: [v1]

---

---
title: e-commerce 問題與建議
tags: v1
---
## Cart

### Function `checkoutAllCart` 成立訂單

```javascript=
    // create order
    const orderItems = await this.getOrderItems(this.userId);
    const args = {
      order_date: new Date(),
      taxRate: orderItems[0].tax_rate,
      currency: orderItems[0].currency,
      paymentMethod: orderItems[0].paymentMethod,
      user_id: this.userId,
    };
    const order = new Order(this.userId);
    const orderObj = await order.create(orderItems, recurringPayment, args);
    let paymentCount = orderObj.recurring_payment.count;
    if (paymentCount === RECURRING_PAYMENT.SUBSCRIPTION.count) {
      paymentCount = 2;
    }
    // create payments
    let paymentResult = [];
    let firstPayment;
    let secondPayment;
    for (let i = 0; i < paymentCount; i++) {
      const payment = new Payment(this.userId, orderObj._id);
      if (i === 0) {
        firstPayment = await payment.createDownPayment(orderObj);
        if (!firstPayment) {
          throw new Error('Create payment failed, please try again.');
        }
      } else {
        const paymentNumber = firstPayment.payment_number;
        secondPayment = await payment.createNextPayment(paymentNumber);
      }
    }
    paymentResult.push(firstPayment, secondPayment);
    let result = { order: orderObj, paymentList: paymentResult };
    return result;
```
### 問題
1. Cart 每一個都有 paymentMethod, 但是成立訂單卻直接拿第一個當作 order 的 paymentMethod（tax_rate, currency 也是）, 這樣子是否在要建立訂單的時候再決定即可, 不用在每一項 cart 加入時都必須帶入 paymentMethod
> paymentMethod 已拿掉, tax_rate 跟 currency 還是有直接取用第一個的問題
>> <font color="red"> tax_rate 與 currency 會寫在產品上，譬如不同的幣值就會是不同的 product item，無法在建立訂單時才確認。</font>
2. [x] `recurringPayment` 這個參數只有一個物件, 是不是代表我不能訂閱制的產品跟單次付款的產品一起結帳, 如果有這種狀況時該怎麼處理
    - <font color="red">感謝提醒，得再看看該如何設計</font>
    - <font color="red">經 5/11 早會討論，維持原設計，但因為payment 的 amount 是直接取用 order 的 amount，需修改這個 bug </font>

3. 上方程式碼第 20 行開始的 for 迴圈, 如果 paymentCount 超過 2, 假設是 3, 那麼 paymentResult 也只會回傳兩張 payment. 不確定如果未來有預付 3 個月, 3 年, 或是買 3 個月送 3 個月的時候, 這裡該怎麼操作
    - <font color="red">recurringPayment 的 count 是觸發次數，此設定已表示時間為何，所以不會有時間上的問題。接下來就是檢查 count 數量，與訂單的張數關係，兩者不等於就是 call function payment.createNextPayment() 產生下期 payment。P.S. 若仍不懂 `recurringPayment` 的設計，可參考[文件](https://hackmd.io/5uFLaBFGQOO286LsiZaCrw) </font>


### 建議
- [x] Function `getOrderItems` 是去找 product info 然後組成 orderItems, 這個名字感覺不是這麼直觀, 改成 `convertToOrderItems` 會不會好一點呢
    - <font color="red">agree 要改名，改為 `combineInfoIntoOrderItems`</font>


- 每次新增商品或減少商品, 都不會給出目前總金額, 這邊前端應該需要, 或許該考慮在 CartSchema 新增金額的欄位, 這樣就不用每次要計算總價的時候都要去找 product 的 table 在去做計算了
    - <font color="red">需再考慮</font>

- checkout 以後,購物車應該就要被清空, 可以將 clear 這個 function 直接擺在 checkoutAllCart 的最後面
    - <font color="red">可討論 clear function 要單獨出來，還是直接放在 checkoutAllCart 裡。我是傾向於不想要綁太死，但使用時要記得 call clear()</font>


## Order

### 問題
1. 如果我要查看我的訂單, 我只知道 user_id, 還需要一個 function 找屬於這個人的訂單(透過 user_id 找), 然後才可以透過找到的 order_id 或是 order_number 去做操作
2. constructor 要求帶入 userId, 但是使用 getAllOrders 卻跟這個人沒有關係, 邏輯有衝突, 
- [x] 綜合以上兩點, 我認為沒有必要在 constructor 要求帶入 user_id, 因為可能會找尋特定範圍的訂單, 不一定跟一個特定的 user 有關係
    - <font color="red">agree</font>

## Payment
### 問題 
1. [x] 如果我想要查關於這個人的所有 payment, 我不知道 order_id, 我只有 user_id, 但是 constructor 卻要求要有 order_id, 我就沒辦法查詢了
    - <font color="red">agree</font>
2. checkoutAllCart 後成立訂單, due_date 就馬上就寫入了, 如果 user 隔天才付款, 甚至隔個幾天, 那麼 due_date 日期就不會正確了
    - <font color="red">目前的設計是，當天成立的訂單必須當天付款，若超過時間就是過期了，所以本來就是要讓 due_date 作為付款最後期限。（這規則是暫定的，要等之後產品功能確認了，才會再做調整。）</font>


## TapPayRepository

### 問題
- [x] constructor 規定要帶入帶入 userId, orderId, paymentId 但是裡面的 function 都沒有用到
    - <font color="red">agree, payByPrice() 和 payBytoken() 會用到，沒寫在函式裡面，但會需要這些參數找到需要的資料，我來修修 </font>
