fix(FE): resolve git pull merge development

This commit is contained in:
randy-ar
2025-12-27 16:49:16 +07:00
90 changed files with 9104 additions and 1849 deletions
+52
View File
@@ -9,10 +9,26 @@ import {
ClosingOutgoingSapronak,
ClosingOverhead,
ClosingSapronakCalculation,
ClosingProductionData,
ClosingHppExpedition,
} from '@/types/api/closing';
import { BaseApiResponse } from '@/types/api/api-general';
import { httpClient, httpClientFetcher } from '@/services/http/client';
import { ClosingSales } from '@/types/api/closing';
// TODO: delete these dummy data later
import {
dummyGetAllFetcher,
dummyGetSingle,
dummyGetAllIncomingSapronakFetcher,
dummyGetAllOutgoingSapronakFetcher,
dummyGetGeneralInfo,
dummyGetPerhitunganSapronak,
dummyGetOverhead,
dummyClosingProductionData,
} from '@/dummy/closing.dummy';
import { sleep } from '@/lib/helper';
export class ClosingApiService extends BaseApiService<Closing, null, null> {
constructor(basePath: string) {
super(basePath);
@@ -71,6 +87,24 @@ export class ClosingApiService extends BaseApiService<Closing, null, null> {
}
}
async getProductionData(
id: number
): Promise<BaseApiResponse<ClosingProductionData> | undefined> {
try {
const getProductionDataPath = `${this.basePath}/${id}/production-data`;
const getProductionDataRes = await httpClient<
BaseApiResponse<ClosingProductionData>
>(getProductionDataPath);
return getProductionDataRes;
} catch (error) {
if (axios.isAxiosError<BaseApiResponse<ClosingProductionData>>(error)) {
return error.response?.data;
}
return undefined;
}
}
async getPerhitunganSapronak(
id: number
): Promise<BaseApiResponse<ClosingSapronakCalculation> | undefined> {
@@ -123,6 +157,24 @@ export class ClosingApiService extends BaseApiService<Closing, null, null> {
return undefined;
}
}
async getHppEkspedisi(
id: number
): Promise<BaseApiResponse<ClosingHppExpedition> | undefined> {
try {
const getHppEkspedisiPath = `${this.basePath}/${id}/expedition-hpp`;
const getHppEkspedisiRes =
await httpClient<BaseApiResponse<ClosingHppExpedition>>(
getHppEkspedisiPath
);
return getHppEkspedisiRes;
} catch (error) {
if (axios.isAxiosError<BaseApiResponse<ClosingHppExpedition>>(error)) {
return error.response?.data;
}
return undefined;
}
}
}
export const ClosingApi = new ClosingApiService('/closings');
+54
View File
@@ -0,0 +1,54 @@
import { BaseApiService } from '@/services/api/base';
import { BaseApiResponse } from '@/types/api/api-general';
import { LogisticPurchasePerSupplierReport } from '@/types/api/report/logistic-stock';
export class LogisticApiService extends BaseApiService<
LogisticPurchasePerSupplierReport,
unknown,
unknown
> {
constructor(basePath: string) {
super(basePath);
}
async getLogisticPurchasePerSupplierReport(
area_id?: string,
supplier_id?: string,
product_id?: string,
product_category_id?: string,
received_date?: string,
po_date?: string,
start_date?: string,
end_date?: string,
sort_by?: string,
filter_by?: string,
page?: number,
limit?: number
): Promise<BaseApiResponse<LogisticPurchasePerSupplierReport> | undefined> {
return await this.customRequest<
BaseApiResponse<LogisticPurchasePerSupplierReport>
>(`purchase-supplier`, {
method: 'GET',
params: {
area_id: area_id,
supplier_id: supplier_id,
product_id: product_id,
product_category_id: product_category_id,
received_date: received_date,
po_date: po_date,
start_date: start_date,
end_date: end_date,
sort_by: sort_by,
filter_by: filter_by,
page: page,
limit: limit,
},
});
}
}
export const LogisticApi = new LogisticApiService('reports');
// export const LogisticApi = new LogisticApiService(
// 'http://localhost:4010/api/reports/logistics'
// );
@@ -0,0 +1,75 @@
import * as XLSX from 'xlsx';
import toast from 'react-hot-toast';
import { BaseApiService } from '@/services/api/base';
import { httpClient, httpClientFetcher } from '@/services/http/client';
import { BaseApiResponse } from '@/types/api/api-general';
import { DailyMarketingReport } from '@/types/api/report/marketing';
import { isResponseError, isResponseSuccess } from '@/lib/api-helper';
import { formatDate, sleep } from '@/lib/helper';
export class MarketingReportApiService extends BaseApiService<
DailyMarketingReport,
unknown,
unknown
> {
constructor(basePath: string = '/reports/marketings/daily-marketing') {
super(basePath);
}
async getAllDailyMarketingFetcher(
endpoint: string
): Promise<BaseApiResponse<DailyMarketingReport>> {
return await httpClientFetcher<BaseApiResponse<DailyMarketingReport>>(
endpoint
);
}
async exportDailyMarketingToExcel(initialQueryString: string) {
const params = new URLSearchParams(initialQueryString);
params.set('limit', '9999999');
const queryString = `?${params.toString()}`;
try {
const dailyMarketingsReport = await httpClientFetcher<
BaseApiResponse<DailyMarketingReport>
>(`${this.basePath}${queryString}`);
if (isResponseError(dailyMarketingsReport)) {
toast.error('Gagal melakukan export penjualan harian! Coba lagi.');
return;
}
const rows = dailyMarketingsReport.data.rows;
const formattedRows = [];
for (let i = 0; i < rows.length; i++) {
formattedRows.push({
...rows[i],
created_user: rows[i].created_user.name,
created_at: formatDate(rows[i].created_at, 'YYYY-MM-DD'),
updated_at: formatDate(rows[i].updated_at, 'YYYY-MM-DD'),
warehouse: rows[i].warehouse.name,
customer: rows[i].customer.name,
product: rows[i].product.name,
});
}
const ws = XLSX.utils.json_to_sheet(formattedRows);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'laporan-penjualan-harian');
// triggers download in browser
XLSX.writeFile(wb, 'laporan-penjualan-harian.xlsx');
} catch (error) {
toast.error('Gagal melakukan export penjualan harian! Coba lagi.');
}
}
}
export const MarketingReportApi = new MarketingReportApiService(
'/reports/marketings/daily-marketing'
);
+53
View File
@@ -0,0 +1,53 @@
import { BaseApiService } from '@/services/api/base';
import { BaseApiResponse } from '@/types/api/api-general';
import { HppPerKandangReport } from '@/types/api/report/hpp-per-kandang';
export class MarketingSaleReportService extends BaseApiService<
HppPerKandangReport,
unknown,
unknown
> {
constructor(basePath: string) {
super(basePath);
}
async getHppPerKandangReport(
area_id?: string,
location_id?: string,
kandang_id?: string,
weight_min?: string,
weight_max?: string,
period?: string,
sort_by?: string,
show_unrecorded?: boolean,
page?: number,
limit?: number
): Promise<BaseApiResponse<HppPerKandangReport> | undefined> {
return await this.customRequest<BaseApiResponse<HppPerKandangReport>>(
`hpp-per-kandang`,
{
method: 'GET',
params: {
area_id: area_id,
location_id: location_id,
kandang_id: kandang_id,
weight_min: weight_min,
weight_max: weight_max,
period: period,
sort_by: sort_by,
show_unrecorded: show_unrecorded,
page: page,
limit: limit,
},
}
);
}
}
export const SaleReportApi = new MarketingSaleReportService(
'reports/marketings'
);
// export const SaleReportApi = new MarketingSaleReportService(
// 'http://localhost:4010/api/reports/marketings'
// );