'use client'; import { ChangeEventHandler, useEffect, useState } from 'react'; import { pdf } from '@react-pdf/renderer'; import toast from 'react-hot-toast'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; import Dropdown from '@/components/dropdown/Dropdown'; import DateInput from '@/components/input/DateInput'; import SelectInput, { OptionType, useSelect, } from '@/components/input/SelectInput'; import Menu from '@/components/menu/Menu'; import MenuItem from '@/components/menu/MenuItem'; import DailyMarketingsTable from '@/components/pages/report/DailyMarketingsTable'; import { useTableFilter } from '@/services/hooks/useTableFilter'; import DailyMarketingReportPDF from '@/components/pages/report/DailyMarketingReportPDF'; import { Area } from '@/types/api/master-data/area'; import { AreaApi, CustomerApi, LocationApi, WarehouseApi, } from '@/services/api/master-data'; import { Warehouse } from '@/types/api/master-data/warehouse'; import { Customer } from '@/types/api/master-data/customer'; import { MarketingReportApi } from '@/services/api/report/marketing-report'; import { MARKETING_DATE_FILTER_TYPE_OPTIONS, MARKETING_TYPE_OPTIONS, } from '@/config/constant'; import { httpClient } from '@/services/http/client'; import { BaseApiResponse } from '@/types/api/api-general'; import { DailyMarketingReport, DailyMarketingReportResponse, } from '@/types/api/report/marketing'; import { isResponseError } from '@/lib/api-helper'; const DailyMarketingReportContent = () => { const { state: tableFilterState, updateFilter, setPage, setPageSize, toQueryString: getTableFilterQueryString, reset: resetFilter, } = useTableFilter({ initial: { search: '', area_id: '', location_id: '', warehouse_id: '', customer_id: '', start_date: '', end_date: '', marketing_type: '', filter_by: '', sort_by: '', }, paramMap: { page: 'page', pageSize: 'limit', area_id: 'area_id', location_id: 'location_id', warehouse_id: 'warehouse_id', customer_id: 'customer_id', start_date: 'start_date', end_date: 'end_date', marketing_type: 'marketing_type', filter_by: 'filter_by', sort_by: 'sort_by', }, }); const dailyMarketingsReportUrl = `${MarketingReportApi.basePath}${getTableFilterQueryString()}`; const [isLoadingExportingToExcel, setIsLoadingExportingToExcel] = useState(false); const [isLoadingExportingToPdf, setIsLoadingExportingToPdf] = useState(false); const [selectedArea, setSelectedArea] = useState(null); const { setInputValue: setAreaInputValue, options: areaOptions, isLoadingOptions: isLoadingAreaOptions, loadMore: loadMoreAreas, } = useSelect(AreaApi.basePath, 'id', 'name'); const areaChangeHandler = (val: OptionType | OptionType[] | null) => { setSelectedArea(val as OptionType); updateFilter('area_id', val ? ((val as OptionType).value as string) : ''); }; const [selectedLocation, setSelectedLocation] = useState( null ); const { setInputValue: setLocationInputValue, options: locationOptions, isLoadingOptions: isLoadingLocationOptions, loadMore: loadMoreLocations, } = useSelect(LocationApi.basePath, 'id', 'name'); const locationChangeHandler = (val: OptionType | OptionType[] | null) => { setSelectedLocation(val as OptionType); updateFilter( 'location_id', val ? ((val as OptionType).value as string) : '' ); }; const [selectedWarehouse, setSelectedWarehouse] = useState( null ); const { setInputValue: setWarehouseInputValue, options: warehouseOptions, isLoadingOptions: isLoadingWarehouseOptions, loadMore: loadMoreWarehouses, } = useSelect(WarehouseApi.basePath, 'id', 'name'); const warehouseChangeHandler = (val: OptionType | OptionType[] | null) => { setSelectedWarehouse(val as OptionType); updateFilter( 'warehouse_id', val ? ((val as OptionType).value as string) : '' ); }; const [selectedCustomer, setSelectedCustomer] = useState( null ); const { setInputValue: setCustomerInputValue, options: customerOptions, isLoadingOptions: isLoadingCustomerOptions, loadMore: loadMoreCustomers, } = useSelect(CustomerApi.basePath, 'id', 'name'); const customerChangeHandler = (val: OptionType | OptionType[] | null) => { setSelectedCustomer(val as OptionType); updateFilter( 'customer_id', val ? ((val as OptionType).value as string) : '' ); }; const startDateChangeHandler = (e: React.ChangeEvent) => { updateFilter('start_date', e.target.value ? e.target.value : ''); }; const endDateChangeHandler = (e: React.ChangeEvent) => { updateFilter('end_date', e.target.value ? e.target.value : ''); }; const [selectedMarketingDateFilterType, setSelectedMarketingDateFilterType] = useState(null); const marketingDateFilterTypeChangeHandler = ( val: OptionType | OptionType[] | null ) => { setSelectedMarketingDateFilterType(val as OptionType); updateFilter('filter_by', val ? ((val as OptionType).value as string) : ''); }; const [selectedMarketingType, setSelectedMarketingType] = useState(null); const marketingTypeChangeHandler = ( val: OptionType | OptionType[] | null ) => { setSelectedMarketingType(val as OptionType); updateFilter( 'marketing_type', val ? ((val as OptionType).value as string) : '' ); }; const searchChangeHandler: ChangeEventHandler = (e) => { updateFilter('search', e.target.value); }; const filterByChangeHandler = (filterBy: string) => { updateFilter('filter_by', filterBy); }; const sortByChangeHandler = (sort: 'asc' | 'desc' | '') => { updateFilter('sort_by', sort); }; const exportToExcelHandler = async () => { setIsLoadingExportingToExcel(true); await MarketingReportApi.exportDailyMarketingToExcel( getTableFilterQueryString() ); setIsLoadingExportingToExcel(false); }; const exportToPdfHandler = async () => { setIsLoadingExportingToPdf(true); const params = new URLSearchParams(getTableFilterQueryString()); params.set('limit', '9999999'); const queryString = `?${params.toString()}`; try { const dailyMarketingsReport = await httpClient( `${MarketingReportApi.basePath}${queryString}` ); if (isResponseError(dailyMarketingsReport)) { toast.error('Gagal melakukan export penjualan harian! Coba lagi.'); return; } const openPdf = async () => { const dailyMarketingReportPdfBlob = await pdf( ).toBlob(); const dailyMarketingReportPdfUrl = URL.createObjectURL( dailyMarketingReportPdfBlob ); window.open(dailyMarketingReportPdfUrl, '_blank'); }; const downloadPdf = async () => { const blob = await pdf( ).toBlob(); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = 'laporan-penjualan-harian.pdf'; link.click(); URL.revokeObjectURL(url); }; await openPdf(); } catch (error) { toast.error('Gagal melakukan export penjualan harian! Coba lagi.'); } setIsLoadingExportingToPdf(false); }; const handleReset = () => { setSelectedArea(null); setSelectedLocation(null); setSelectedWarehouse(null); setSelectedCustomer(null); setSelectedMarketingType(null); resetFilter(); }; useEffect(() => { if ( tableFilterState.filter_by === 'realization_date' || tableFilterState.filter_by === 'so_date' ) { setSelectedMarketingDateFilterType({ label: tableFilterState.filter_by === 'realization_date' ? 'Tanggal Realisasi' : 'Tanggal SO', value: tableFilterState.filter_by, }); } else { setSelectedMarketingDateFilterType(null); } }, [tableFilterState.filter_by]); return (

Penjualan Harian

{/* Filters */}
Export{' '} } >
); }; export default DailyMarketingReportContent;