97 lines
3.8 KiB
JavaScript
97 lines
3.8 KiB
JavaScript
import axios from "axios";
|
|
export class PaperflyAdapter {
|
|
courierName = "paperfly";
|
|
apiKey;
|
|
username;
|
|
password;
|
|
storeName;
|
|
client;
|
|
enabled;
|
|
constructor(apiKey, username, password, storeName, baseUrl) {
|
|
this.apiKey = apiKey;
|
|
this.username = username;
|
|
this.password = password;
|
|
this.storeName = storeName;
|
|
this.enabled = Boolean(apiKey && username && password);
|
|
this.client = axios.create({
|
|
baseURL: baseUrl,
|
|
timeout: 15000,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
isConfigured() {
|
|
return this.enabled;
|
|
}
|
|
async createParcel(req) {
|
|
if (!this.enabled) {
|
|
throw new Error("Paperfly credentials (paperflykey + merchant username & password) are not configured.");
|
|
}
|
|
if (!this.storeName) {
|
|
throw new Error("Paperfly store name is required to create a parcel.");
|
|
}
|
|
const payload = {
|
|
merchantOrderReference: req.invoice,
|
|
storeName: this.storeName,
|
|
productBrief: req.item_type || "Product",
|
|
packagePrice: String(req.value ?? req.cod_amount ?? 0),
|
|
max_weight: String(req.item_weight ?? 0.5),
|
|
customerName: req.recipient_name,
|
|
customerAddress: req.recipient_address,
|
|
customerPhone: req.recipient_phone,
|
|
};
|
|
const response = await this.client.post("/merchant/api/service/new_order_v2.php", payload, {
|
|
headers: { paperflykey: this.apiKey },
|
|
auth: { username: this.username, password: this.password },
|
|
});
|
|
const data = response.data;
|
|
const ok = data?.success;
|
|
if (!ok?.tracking_number) {
|
|
throw new Error(`Paperfly API error: ${JSON.stringify(data?.error || data?.message || data)}`);
|
|
}
|
|
return {
|
|
success: true,
|
|
courier: "paperfly",
|
|
tracking_code: ok.tracking_number,
|
|
consignment_id: ok.tracking_barcode || ok.tracking_number,
|
|
invoice: req.invoice,
|
|
status: ok.message || "created",
|
|
cod_amount: req.cod_amount,
|
|
created_at: new Date().toISOString(),
|
|
raw_response: data,
|
|
};
|
|
}
|
|
async trackParcel(trackingCode) {
|
|
if (!this.enabled) {
|
|
throw new Error("Paperfly credentials are not configured.");
|
|
}
|
|
if (!this.username || !this.password) {
|
|
throw new Error("Paperfly tracking needs your merchant-panel username & password (Basic Auth). Add them to use track_parcel.");
|
|
}
|
|
// Paperfly tracks by your merchant order reference (merchantOrderReference), not its tracking number.
|
|
const response = await this.client.post("/API-Order-Tracking", { ReferenceNumber: trackingCode }, { headers: { paperflykey: this.apiKey }, auth: { username: this.username, password: this.password } });
|
|
const data = response.data;
|
|
const st = data?.success?.trackingStatus?.[0] || {};
|
|
const stages = [
|
|
[st.Delivered, "delivered"],
|
|
[st.Partial, "partial-delivery"],
|
|
[st.Returned, "returned"],
|
|
[st.PickedForDelivery, "out-for-delivery"],
|
|
[st.inTransit, "in-transit"],
|
|
[st.ReceivedAtPoint, "received-at-point"],
|
|
[st.Pick, "picked-up"],
|
|
];
|
|
const status = stages.find(([v]) => v && String(v).trim())?.[1] || data?.success?.message || "pending";
|
|
return {
|
|
success: true,
|
|
courier: "paperfly",
|
|
tracking_code: trackingCode,
|
|
status,
|
|
updated_at: new Date().toISOString(),
|
|
raw_response: data,
|
|
};
|
|
}
|
|
async getBalance() {
|
|
throw new Error("Paperfly does not expose a merchant balance endpoint via its public API — check the Paperfly merchant panel.");
|
|
}
|
|
}
|