import { getInvoiceBillsList, invoiceBillDataType, submitInvoice } from '@/web/support/wallet/bill/invoice/api'; import { Box, Button, Checkbox, Flex, Table, TableContainer, Tbody, Td, Th, Thead, Tr, useDisclosure } from '@chakra-ui/react'; import { billTypeMap } from '@fastgpt/global/support/wallet/bill/constants'; import { formatStorePrice2Read } from '@fastgpt/global/support/wallet/usage/tools'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import dayjs from 'dayjs'; import { useTranslation } from 'next-i18next'; import { useCallback, useState } from 'react'; import MyIcon from '@fastgpt/web/components/common/Icon'; import Divider from '@/pages/app/detail/components/WorkflowComponents/Flow/components/Divider'; import { TeamInvoiceHeaderType } from '@fastgpt/global/support/user/team/type'; import { InvoiceHeaderSingleForm } from './InvoiceHeaderForm'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { getTeamInvoiceHeader } from '@/web/support/user/team/api'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useRouter } from 'next/router'; import { useForm } from 'react-hook-form'; type chosenBillDataType = { _id: string; price: number; }; const ApplyInvoiceModal = ({ onClose }: { onClose: () => void }) => { const { t } = useTranslation(); const router = useRouter(); const [chosenBillDataList, setChosenBillDataList] = useState([]); const [totalPrice, setTotalPrice] = useState(0); const { isOpen: isOpenSettleModal, onOpen: onOpenSettleModal, onClose: onCloseSettleModal } = useDisclosure(); const { loading: isLoading, data: billsList, run: getInvoiceBills } = useRequest2(() => getInvoiceBillsList(), { manual: false }); const handleSingleCheck = useCallback( (item: invoiceBillDataType) => { if (chosenBillDataList.find((bill) => bill._id === item._id)) { setChosenBillDataList(chosenBillDataList.filter((bill) => bill._id !== item._id)); } else { setChosenBillDataList([...chosenBillDataList, { _id: item._id, price: item.price }]); } }, [chosenBillDataList] ); const { runAsync: onSubmitApply, loading: isSubmitting } = useRequest2( (data) => submitInvoice({ amount: totalPrice, billIdList: chosenBillDataList.map((item) => item._id), ...data }), { manual: true, successToast: t('account_bill:submit_success'), errorToast: t('account_bill:submit_failed'), onSuccess: () => { onClose(); router.reload(); } } ); const inputForm = useForm({ defaultValues: { teamName: '', unifiedCreditCode: '', companyAddress: '', companyPhone: '', bankName: '', bankAccount: '', needSpecialInvoice: false, contactPhone: '', emailAddress: '' } }); const { loading: isLoadingHeader } = useRequest2(() => getTeamInvoiceHeader(), { manual: false, onSuccess: (res) => inputForm.reset(res) }); const handleBack = useCallback(() => { setChosenBillDataList([]); getInvoiceBills(); onCloseSettleModal(); }, [getInvoiceBills, onCloseSettleModal]); return ( {!isOpenSettleModal ? ( {t('account_bill:support_wallet_apply_invoice')} {billsList?.map((item) => ( { if (e.target?.name && e.target.name === 'check') return; handleSingleCheck(item); }} _hover={{ bg: 'blue.50' }} > ))}
{ !e.target.checked ? setChosenBillDataList([]) : setChosenBillDataList( billsList?.map((item) => ({ _id: item._id, price: item.price })) || [] ); }} /> {t('account_bill:type')} {t('account_bill:time')} {t('account_bill:support_wallet_amount')}
i._id === item._id)} /> {t(billTypeMap[item.type]?.label as any)} {item.createTime ? dayjs(item.createTime).format('YYYY/MM/DD HH:mm:ss') : '-'} {t('account_bill:yuan', { amount: formatStorePrice2Read(item.price) })}
{!isLoading && billsList && billsList.length === 0 && ( {t('account_bill:no_invoice_record')} )}
) : ( {t('account_bill:support_wallet_amount')} {t('account_bill:yuan', { amount: formatStorePrice2Read(totalPrice) })} {t('account_bill:invoice_sending_info')} )}
); }; export default ApplyInvoiceModal;