diff --git a/src/services/flowaccount.ts b/src/services/flowaccount.ts index 80c0ca0..df20be0 100644 --- a/src/services/flowaccount.ts +++ b/src/services/flowaccount.ts @@ -3,6 +3,7 @@ import config from "../config.json"; import { CustomerType, PayCondition } from "@prisma/client"; import { convertTemplate } from "../utils/string-template"; import { htmlToText } from "html-to-text"; +import { JsonObject } from "@prisma/client/runtime/library"; if (!process.env.FLOW_ACCOUNT_URL) throw new Error("Require FLOW_ACCOUNT_URL"); if (!process.env.FLOW_ACCOUNT_CLIENT_ID) throw new Error("Require FLOW_ACCOUNT_CLIENT_ID"); @@ -388,6 +389,189 @@ const flowAccount = { } return null; }, + + // flowAccount GET Product list + async getProducts() { + const { token } = await flowAccountAPI.auth(); + + const res = await fetch(api + "/products", { + method: "GET", + headers: { + ["Content-Type"]: `application/json`, + ["Authorization"]: `Bearer ${token}`, + }, + }); + + return { + ok: res.ok, + status: res.status, + body: await res.json(), + }; + }, + + // flowAccount GET Product by id + async getProductsById(recordId: string) { + const { token } = await flowAccountAPI.auth(); + + const res = await fetch(api + `/products/${recordId}`, { + method: "GET", + headers: { + ["Content-Type"]: `application/json`, + ["Authorization"]: `Bearer ${token}`, + }, + }); + + const data = await res.json(); + + return { + ok: res.ok, + status: res.status, + list: data.data.list, + total: data.data.total, + }; + }, + + // flowAccount POST create Product + async createProducts(body: JsonObject) { + const { token } = await flowAccountAPI.auth(); + + const commonBody = { + productStructureType: null, + type: "3", + name: body.name, + sellDescription: body.detail, + sellVatType: 3, + unitName: "Unit", + categoryName: "Car", + }; // helper function สำหรับสร้าง product + + const createProduct = async (price: any, vatIncluded: boolean) => { + try { + const res = await fetch(api + "/products", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + ...commonBody, + sellPrice: price, + sellVatType: vatIncluded ? 1 : 3, + }), + }); + + if (!res.ok) { + throw new Error(`Request failed with status ${res.status}`); + } // ป้องกัน response ที่ไม่ใช่ JSON หรือว่าง + + let json: any = null; + try { + json = await res.json(); + } catch { + throw new Error("Response is not valid JSON"); + } + + return json?.data?.list?.[0]?.id ?? null; + } catch (err) { + console.error("createProduct error:", err); + return null; + } + }; + + const [sellId, agentId] = await Promise.all([ + createProduct(body.price, /true/.test(`${body.vatIncluded}`)), + createProduct(body.agentPrice, /true/.test(`${body.agentPriceVatIncluded}`)), + ]); + + return { + ok: !!(agentId && sellId), + status: agentId && sellId ? 200 : 500, + data: { + productIdAgentPrice: agentId, + productIdSellPrice: sellId, + }, + }; + }, + + // flowAccount PUT edit Product + async editProducts(sellPriceId: String, agentPriceId: String, body: JsonObject) { + console.log("body: ", body); + const { token } = await flowAccountAPI.auth(); + + const commonBody = { + productStructureType: null, + type: "3", + name: body.name, + sellDescription: body.detail, + sellVatType: 3, + unitName: "Unit", + categoryName: "Car", + }; // helper function สำหรับสร้าง product + + const editProduct = async (id: String, price: any, vatIncluded: boolean) => { + try { + const res = await fetch(api + `/products/${id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ + ...commonBody, + sellPrice: price, + sellVatType: vatIncluded ? 1 : 3, + }), + }); + + if (!res.ok) { + throw new Error(`Request failed with status ${res.status}`); + } // ป้องกัน response ที่ไม่ใช่ JSON หรือว่าง + + let json: any = null; + try { + json = await res.json(); + } catch { + throw new Error("Response is not valid JSON"); + } + + return json?.data?.list?.[0]?.id ?? null; + } catch (err) { + console.error("createProduct error:", err); + return null; + } + }; + + const [agentId, sellId] = await Promise.all([ + editProduct(sellPriceId, body.price, /true/.test(`${body.vatIncluded}`)), + editProduct(agentPriceId, body.agentPrice, /true/.test(`${body.agentPriceVatIncluded}`)), + ]); + + return { + ok: !!(agentId && sellId), + status: agentId && sellId ? 200 : 500, + data: { + productIdAgentPrice: agentId, + productIdSellPrice: sellId, + }, + }; + }, + + // flowAccount DELETE Product + async deleteProduct(recordId: string) { + const { token } = await flowAccountAPI.auth(); + + const res = await fetch(api + `/products/${recordId}`, { + method: "DELETE", + headers: { + ["Authorization"]: `Bearer ${token}`, + }, + }); + + return { + ok: res.ok, + status: res.status, + }; + }, }; export default flowAccount;