Skip to content

API Trả Hàng (Return) ​

Module Return cung cấp các phương thức để quản lý quy trình trả hàng, hoàn tiền và xử lý vận chuyển trả hàng trong hệ thống Pancake POS.

Khởi Tạo ​

typescript
import { PancakeClient } from 'pancake-client-sdk';

const client = new PancakeClient('your-api-key', 'your-shop-id');
const returnApi = client.return;

Quản Lý Đơn Trả Hàng ​

Lấy Danh Sách Đơn Trả ​

typescript
const { data: returns } = await client.return.list({
  page_size: 20,
  page_number: 1,
  status: 'pending',
  from_date: '2024-04-01',
  to_date: '2024-04-30'
});

Tham Số Lọc ​

TênKiểuBắt buộcMô tả
page_sizenumberkhôngSố đơn trên trang
page_numbernumberkhôngSố trang
statusstringkhôngTrạng thái đơn
reason_typestringkhôngLoại lý do trả hàng
from_datestringkhôngTừ ngày (YYYY-MM-DD)
to_datestringkhôngĐến ngày (YYYY-MM-DD)
searchstringkhôngTìm kiếm
order_idstringkhôngLọc theo đơn hàng

Tạo Đơn Trả Hàng ​

typescript
const newReturn = await client.return.create({
  order_id: 'order-123',
  reason_type: 'customer',
  reason_note: 'Khách đổi size',
  items: [
    {
      product_id: 'product-1',
      variation_id: 'var-1',
      quantity: 1,
      reason: 'Size không vừa',
      condition: 'new',
      refund_amount: 299000,
      images: ['image1.jpg', 'image2.jpg']
    }
  ],
  refund_method: 'bank_transfer',
  shipping_fee: 30000
});

Cập Nhật Đơn Trả ​

typescript
const updatedReturn = await client.return.update('return-id', {
  status: 'approved',
  refund_method: 'bank_transfer',
  shipping_fee: 35000
});

Xem Chi Tiết Đơn Trả ​

typescript
const returnDetail = await client.return.getById('return-id');

Hủy Đơn Trả ​

typescript
const cancelledReturn = await client.return.cancel(
  'return-id',
  'Khách hàng không gửi trả hàng'
);

Xử Lý Đơn Trả ​

Phê Duyệt Đơn Trả ​

typescript
const approvedReturn = await client.return.approve('return-id', {
  refund_method: 'bank_transfer',
  refund_amount: 299000,
  note: 'Đã kiểm tra hàng hóa'
});

Từ Chối Đơn Trả ​

typescript
const rejectedReturn = await client.return.reject(
  'return-id',
  'Hàng đã qua sử dụng nhiều'
);

Hoàn Thành Đơn Trả ​

typescript
const completedReturn = await client.return.complete('return-id', {
  note: 'Đã nhận hàng và hoàn tiền',
  received_items: [
    {
      product_id: 'product-1',
      variation_id: 'var-1',
      quantity: 1,
      condition: 'new'
    }
  ]
});

Vận Chuyển Trả Hàng ​

Tạo Vận Đơn Trả Hàng ​

typescript
const label = await client.return.generateLabel('return-id', {
  shipping_method: 'standard',
  include_qr: true
});

Lấy Báo Giá Vận Chuyển ​

typescript
const rates = await client.return.getShippingRates('return-id');

Ghi Chú ​

Thêm Ghi Chú ​

typescript
const note = await client.return.addNote(
  'return-id',
  'Đã liên hệ khách hàng về việc gửi trả hàng'
);

Lấy Danh Sách Ghi Chú ​

typescript
const { data: notes } = await client.return.getNotes('return-id');

Thống Kê ​

Lấy Thống Kê Trả Hàng ​

typescript
const stats = await client.return.getStats({
  from_date: '2024-04-01',
  to_date: '2024-04-30'
});

Xem Lịch Sử Trả Hàng Theo Đơn ​

typescript
const { data: orderReturns } = await client.return.getByOrder('order-id');

Models ​

OrderReturn ​

typescript
interface OrderReturn {
  id: string;
  order_id: string;
  status: ReturnStatus;
  reason_type: ReturnReasonType;
  reason_note?: string;
  items: ReturnItem[];
  refund_amount: number;
  refund_method?: RefundMethod;
  refund_status: RefundStatus;
  shipping_fee?: number;
  created_by: {
    id: string;
    name: string;
  };
  approved_by?: {
    id: string;
    name: string;
  };
  created_at: string;
  updated_at: string;
  completed_at?: string;
}

ReturnStatus ​

Các trạng thái đơn trả hàng:

  • pending: Chờ xử lý
  • approved: Đã duyệt
  • rejected: Từ chối
  • completed: Hoàn thành
  • cancelled: Đã hủy

ReturnReasonType ​

Các loại lý do trả hàng:

  • customer: Do khách hàng
  • staff: Do nhân viên
  • product: Do sản phẩm
  • shipping: Do đơn vị vận chuyển
  • exchange: Do đổi hàng

RefundMethod ​

Các phương thức hoàn tiền:

  • cash: Tiền mặt
  • bank_transfer: Chuyển khoản
  • e_wallet: Ví điện tử
  • store_credit: Tích điểm
  • refund_to_original: Hoàn tiền về phương thức thanh toán gốc

Ví Dụ Sử Dụng ​

Quy Trình Xử Lý Đơn Trả Hàng ​

typescript
async function processReturnRequest(orderId: string, items: any[]) {
  try {
    // 1. Tạo đơn trả hàng
    const returnOrder = await client.return.create({
      order_id: orderId,
      reason_type: 'customer',
      reason_note: 'Khách đổi size',
      items: items.map(item => ({
        product_id: item.product_id,
        variation_id: item.variation_id,
        quantity: item.quantity,
        reason: item.reason,
        condition: 'new',
        refund_amount: item.refund_amount
      })),
      refund_method: 'bank_transfer'
    });

    // 2. Lấy báo giá vận chuyển
    const shippingRates = await client.return.getShippingRates(returnOrder.id);
    
    // 3. Tạo vận đơn trả hàng
    const label = await client.return.generateLabel(returnOrder.id, {
      shipping_method: shippingRates[0].service
    });

    // 4. Thêm ghi chú theo dõi
    await client.return.addNote(
      returnOrder.id,
      `Đã tạo vận đơn trả hàng: ${label.download_url}`
    );

    return {
      return_id: returnOrder.id,
      shipping_label: label.download_url
    };

  } catch (error) {
    console.error('Lỗi khi xử lý đơn trả hàng:', error);
    throw error;
  }
}

Theo Dõi và Báo Cáo Trả Hàng ​

typescript
async function analyzeReturns() {
  try {
    // Lấy thống kê
    const stats = await client.return.getStats({
      from_date: '2024-04-01',
      to_date: '2024-04-30'
    });

    console.log(`
      Thống kê trả hàng:
      - Tổng số đơn: ${stats.total_returns}
      - Tổng giá trị hoàn: ${stats.total_refund_amount.toLocaleString()} VND
      - Tỷ lệ trả hàng: ${stats.return_rate.toFixed(2)}%
      - Thời gian xử lý TB: ${stats.average_processing_time} giờ
      
      Phân bố theo trạng thái:
    `);

    Object.entries(stats.by_status).forEach(([status, count]) => {
      console.log(`${status}: ${count} đơn`);
    });

    console.log('\nPhân bố theo lý do:');
    Object.entries(stats.by_reason).forEach(([reason, count]) => {
      console.log(`${reason}: ${count} đơn`);
    });

    // Lấy danh sách đơn đang xử lý
    const { data: pendingReturns } = await client.return.list({
      status: 'pending',
      page_size: 50
    });

    console.log('\nĐơn trả hàng cần xử lý:');
    pendingReturns.forEach(ret => {
      console.log(`
        ID: ${ret.id}
        Đơn hàng: ${ret.order_id}
        Lý do: ${ret.reason_type} - ${ret.reason_note}
        Giá trị hoàn: ${ret.refund_amount.toLocaleString()} VND
        Thời gian tạo: ${new Date(ret.created_at).toLocaleString()}
      `);
    });

  } catch (error) {
    console.error('Lỗi khi phân tích dữ liệu trả hàng:', error);
  }
}