271 lines
6.6 KiB
Markdown
271 lines
6.6 KiB
Markdown
|
|
# Refund Order API Documentation
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
The Refund Order API provides comprehensive functionality to process refunds for paid orders. This includes order status updates, transaction creation, customer voucher reversal, payment gateway refunds, and customer notifications.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- ✅ **Order Status Management**: Updates order status to "REFUNDED"
|
||
|
|
- ✅ **Transaction Tracking**: Creates refund transactions with negative amounts
|
||
|
|
- ✅ **Customer Voucher Reversal**: Reverses any vouchers/points given for the order
|
||
|
|
- ✅ **Payment Gateway Integration**: Handles refunds for non-cash payments
|
||
|
|
- ✅ **Customer Notifications**: Sends email notifications for refunds
|
||
|
|
- ✅ **Audit Trail**: Tracks who processed the refund and when
|
||
|
|
- ✅ **Refund History**: Provides endpoint to view refund history
|
||
|
|
|
||
|
|
## API Endpoints
|
||
|
|
|
||
|
|
### 1. Process Refund
|
||
|
|
|
||
|
|
**POST** `/order/refund`
|
||
|
|
|
||
|
|
Process a refund for a paid order.
|
||
|
|
|
||
|
|
#### Request Body
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"order_id": 123,
|
||
|
|
"reason": "Customer request"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Request Parameters
|
||
|
|
|
||
|
|
| Parameter | Type | Required | Description |
|
||
|
|
|-----------|--------|----------|--------------------------------|
|
||
|
|
| order_id | int64 | Yes | ID of the order to refund |
|
||
|
|
| reason | string | Yes | Reason for the refund |
|
||
|
|
|
||
|
|
#### Response
|
||
|
|
|
||
|
|
**Success (200 OK)**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"status": 200,
|
||
|
|
"data": {
|
||
|
|
"order_id": 123,
|
||
|
|
"status": "REFUNDED",
|
||
|
|
"refund_amount": 100000,
|
||
|
|
"reason": "Customer request",
|
||
|
|
"refunded_at": "2024-01-15T10:30:00Z",
|
||
|
|
"customer_name": "John Doe",
|
||
|
|
"payment_type": "CASH"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Error (400 Bad Request)**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": false,
|
||
|
|
"status": 400,
|
||
|
|
"message": "only paid order can be refund"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Get Refund History
|
||
|
|
|
||
|
|
**GET** `/order/refund-history`
|
||
|
|
|
||
|
|
Retrieve refund history with filtering and pagination.
|
||
|
|
|
||
|
|
#### Query Parameters
|
||
|
|
|
||
|
|
| Parameter | Type | Required | Description |
|
||
|
|
|-------------|--------|----------|--------------------------------|
|
||
|
|
| limit | int | No | Number of records (max 100) |
|
||
|
|
| offset | int | No | Number of records to skip |
|
||
|
|
| start_date | string | No | Start date (RFC3339 format) |
|
||
|
|
| end_date | string | No | End date (RFC3339 format) |
|
||
|
|
|
||
|
|
#### Response
|
||
|
|
|
||
|
|
**Success (200 OK)**
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"success": true,
|
||
|
|
"status": 200,
|
||
|
|
"data": [
|
||
|
|
{
|
||
|
|
"order_id": 123,
|
||
|
|
"customer_name": "John Doe",
|
||
|
|
"customer_id": 456,
|
||
|
|
"is_member": true,
|
||
|
|
"status": "REFUNDED",
|
||
|
|
"amount": 95000,
|
||
|
|
"total": 100000,
|
||
|
|
"payment_type": "CASH",
|
||
|
|
"table_number": "A1",
|
||
|
|
"order_type": "DINE_IN",
|
||
|
|
"created_at": "2024-01-15T09:00:00Z",
|
||
|
|
"refunded_at": "2024-01-15T10:30:00Z",
|
||
|
|
"tax": 5000
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"paging_meta": {
|
||
|
|
"page": 1,
|
||
|
|
"total": 25,
|
||
|
|
"limit": 20
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Business Logic
|
||
|
|
|
||
|
|
### Refund Process Flow
|
||
|
|
|
||
|
|
1. **Validation**
|
||
|
|
- Verify order exists and belongs to partner
|
||
|
|
- Ensure order status is "PAID"
|
||
|
|
- Validate refund reason
|
||
|
|
|
||
|
|
2. **Order Update**
|
||
|
|
- Update order status to "REFUNDED"
|
||
|
|
- Store refund reason in order description
|
||
|
|
- Update timestamp
|
||
|
|
|
||
|
|
3. **Transaction Creation**
|
||
|
|
- Create refund transaction with negative amount
|
||
|
|
- Set transaction type to "REFUND"
|
||
|
|
- Track who processed the refund
|
||
|
|
|
||
|
|
4. **Customer Voucher Reversal**
|
||
|
|
- Find vouchers associated with the order
|
||
|
|
- Mark vouchers as reversed/cancelled
|
||
|
|
- Adjust customer points if applicable
|
||
|
|
|
||
|
|
5. **Payment Gateway Refund**
|
||
|
|
- For non-cash payments, call payment gateway refund API
|
||
|
|
- Handle gateway response and errors
|
||
|
|
- Update transaction with gateway details
|
||
|
|
|
||
|
|
6. **Customer Notification**
|
||
|
|
- Send email notification to customer
|
||
|
|
- Include refund details and reason
|
||
|
|
- Provide transaction reference
|
||
|
|
|
||
|
|
### Supported Payment Methods
|
||
|
|
|
||
|
|
| Payment Method | Refund Handling |
|
||
|
|
|----------------|-----------------------------------|
|
||
|
|
| CASH | Manual refund (no gateway call) |
|
||
|
|
| QRIS | Gateway refund via provider API |
|
||
|
|
| CARD | Gateway refund via provider API |
|
||
|
|
| TRANSFER | Gateway refund via provider API |
|
||
|
|
| ONLINE | Gateway refund via provider API |
|
||
|
|
|
||
|
|
### Error Handling
|
||
|
|
|
||
|
|
- **Order not found**: Returns 404 error
|
||
|
|
- **Order not paid**: Returns 400 error with message
|
||
|
|
- **Voucher reversal failure**: Logs warning but continues refund
|
||
|
|
- **Payment gateway failure**: Logs error but continues refund
|
||
|
|
- **Notification failure**: Logs warning but continues refund
|
||
|
|
|
||
|
|
## Database Schema
|
||
|
|
|
||
|
|
### Orders Table
|
||
|
|
|
||
|
|
```sql
|
||
|
|
ALTER TABLE orders ADD COLUMN description TEXT;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Transactions Table
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Refund transactions have negative amounts
|
||
|
|
-- Transaction type: "REFUND"
|
||
|
|
-- Status: "REFUND"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Constants
|
||
|
|
|
||
|
|
### Order Status
|
||
|
|
|
||
|
|
```go
|
||
|
|
const (
|
||
|
|
New OrderStatus = "NEW"
|
||
|
|
Paid OrderStatus = "PAID"
|
||
|
|
Cancel OrderStatus = "CANCEL"
|
||
|
|
Pending OrderStatus = "PENDING"
|
||
|
|
Refunded OrderStatus = "REFUNDED" // New status
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Transaction Status
|
||
|
|
|
||
|
|
```go
|
||
|
|
const (
|
||
|
|
New PaymentStatus = "NEW"
|
||
|
|
Paid PaymentStatus = "PAID"
|
||
|
|
Cancel PaymentStatus = "CANCEL"
|
||
|
|
Refund PaymentStatus = "REFUND" // New status
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
Run the refund tests:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
go test ./internal/services/v2/order -v -run TestRefund
|
||
|
|
```
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
1. **Authorization**: Only authorized users can process refunds
|
||
|
|
2. **Audit Trail**: All refunds are logged with user and timestamp
|
||
|
|
3. **Validation**: Strict validation prevents invalid refunds
|
||
|
|
4. **Rate Limiting**: Consider implementing rate limiting for refund endpoints
|
||
|
|
|
||
|
|
## Future Enhancements
|
||
|
|
|
||
|
|
1. **Partial Refunds**: Support for refunding specific order items
|
||
|
|
2. **Refund Approval Workflow**: Multi-level approval for large refunds
|
||
|
|
3. **Refund Analytics**: Dashboard for refund trends and analysis
|
||
|
|
4. **Automated Refunds**: Integration with customer service systems
|
||
|
|
5. **Refund Templates**: Predefined refund reasons and templates
|
||
|
|
|
||
|
|
## Integration Examples
|
||
|
|
|
||
|
|
### cURL Example
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl -X POST http://localhost:8080/api/v1/order/refund \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
||
|
|
-d '{
|
||
|
|
"order_id": 123,
|
||
|
|
"reason": "Customer request"
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### JavaScript Example
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
const refundOrder = async (orderId, reason) => {
|
||
|
|
const response = await fetch('/api/v1/order/refund', {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
'Authorization': `Bearer ${token}`
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
order_id: orderId,
|
||
|
|
reason: reason
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
return response.json();
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
## Support
|
||
|
|
|
||
|
|
For questions or issues with the refund API, please contact the development team or create an issue in the project repository.
|