| @@ -156,7 +156,7 @@ const SearchDemandNoteForm = ({ applySearch, orgComboData, searchCriteria, issue | |||
| }} | |||
| renderInput={(params) => ( | |||
| <TextField {...params} | |||
| label="Organisation" | |||
| label="BR No./Organisation" | |||
| InputLabelProps={{ | |||
| shrink: true | |||
| }} | |||
| @@ -14,7 +14,7 @@ const MainCard = Loadable(React.lazy(() => import('components/MainCard'))); | |||
| const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||
| import DownloadIcon from '@mui/icons-material/Download'; | |||
| // ==============================|| DASHBOARD - DEFAULT ||============================== // | |||
| const PaymentDetails = ({ formData,doPrint }) => { | |||
| const PaymentDetails = ({ formData,doPrint,onDownload }) => { | |||
| const [data, setData] = React.useState({}); | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| @@ -158,10 +158,14 @@ const PaymentDetails = ({ formData,doPrint }) => { | |||
| </FormLabel> | |||
| </Grid> | |||
| <Grid xs={6} md={5} sx={{ml:5,textAlign: "left" }}> | |||
| {onDownload? | |||
| <LoadingComponent disableText={true} alignItems="flex-start"/> | |||
| : | |||
| <Button className="printHidden" variant="contained" sx={{ mt:2 }} onClick={doPrint}> | |||
| <DownloadIcon/> | |||
| <Typography sx={{fontSize: "16px"}}>Download</Typography> | |||
| </Button> | |||
| } | |||
| </Grid> | |||
| </Grid> | |||
| </Grid> | |||
| @@ -4,7 +4,7 @@ import { | |||
| Typography, | |||
| Stack, | |||
| Box, | |||
| // Button | |||
| Button | |||
| } from '@mui/material'; | |||
| import * as UrlUtils from "utils/ApiPathConst"; | |||
| import * as React from "react"; | |||
| @@ -12,6 +12,7 @@ import * as HttpUtils from "utils/HttpUtils"; | |||
| import * as DateUtils from "utils/DateUtils"; | |||
| import { useParams } from "react-router-dom"; | |||
| import { useNavigate } from "react-router-dom"; | |||
| import ForwardIcon from '@mui/icons-material/Forward'; | |||
| import Loadable from 'components/Loadable'; | |||
| const LoadingComponent = Loadable(React.lazy(() => import('pages/extra-pages/LoadingComponent'))); | |||
| @@ -37,6 +38,7 @@ const Index = () => { | |||
| const [record, setRecord] = React.useState(); | |||
| const [itemList, setItemList] = React.useState([]); | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| const [onDownload, setOnDownload] = React.useState(false); | |||
| // const [detailsOrder, setDetailsOrder] = React.useState(2); | |||
| React.useEffect(() => { | |||
| @@ -54,8 +56,15 @@ const Index = () => { | |||
| const doPrint = () => { | |||
| // window.print(); | |||
| setOnDownload(true) | |||
| HttpUtils.fileDownload({ | |||
| url: UrlUtils.GEN_PAYMENT_RECEIPT+"/"+params.id, | |||
| onResponse:()=>{ | |||
| setOnDownload(false) | |||
| }, | |||
| onError:()=>{ | |||
| setOnDownload(false) | |||
| } | |||
| }); | |||
| }; | |||
| @@ -98,6 +107,15 @@ const Index = () => { | |||
| </Stack> | |||
| </div> | |||
| </Grid> | |||
| <Grid item xs={12} width={{xs:"90%", sm:"90%", md:"90%", lg:"90%"}}> | |||
| <Button | |||
| aria-label={"back"} | |||
| title={"back"} | |||
| sx={{ ml: 0, mt: 2.5 }} style={{ border: '2px solid' }} variant="outlined" onClick={() => { navigate(-1) }} | |||
| > | |||
| <ForwardIcon style={{ height: 30, width: 50, transform: "rotate(180deg)" }} /> | |||
| </Button> | |||
| </Grid> | |||
| {/*row 1*/} | |||
| <Grid item xs={12} md={12} sx={{textAlign: "center" }}> | |||
| <Grid container justifyContent="center" direction="column" spacing={2} sx={{ p: 2 }} alignitems="stretch" > | |||
| @@ -106,6 +124,7 @@ const Index = () => { | |||
| <PaymentDetails | |||
| formData={record} | |||
| doPrint={doPrint} | |||
| onDownload={onDownload} | |||
| style={{ | |||
| display: "flex", | |||
| height: "100%", | |||
| @@ -32,6 +32,8 @@ import UnionPayIcon from "assets/images/icons/unionpay.svg"; | |||
| import PpsIcon from "assets/images/icons/ppshk.svg"; | |||
| import FpsIcon from "assets/images/icons/fps.svg"; | |||
| import {FormattedMessage, useIntl} from "react-intl"; | |||
| import * as HttpUtils from "utils/HttpUtils" | |||
| import * as UrlUtils from "utils/ApiPathConst" | |||
| const MultiPaymentWindow = (props) => { | |||
| const intl = useIntl(); | |||
| @@ -52,7 +54,10 @@ const MultiPaymentWindow = (props) => { | |||
| const [pPSClass, setPPSlass] = useState(""); | |||
| const [filteredPaymentMethod, setFilteredPaymentMethod] = useState([]); | |||
| const [onReady, setOnReady] = useState(false); | |||
| const [paymentHoldedErrText, setPaymentHoldedErrText] = React.useState(""); | |||
| const [paymentHoldedErr, setPaymentHoldedErr] = React.useState(false); | |||
| useEffect(() => { | |||
| // console.log(props.transactionData) | |||
| if(Object.keys(props.transactionData).length > 0){ | |||
| @@ -185,7 +190,49 @@ const MultiPaymentWindow = (props) => { | |||
| }; | |||
| const confirmPaymentHandle = () => () =>{ | |||
| props.setConfirmPayment(true); | |||
| handlePaymentCheck() | |||
| }; | |||
| const handlePaymentCheck = () => { | |||
| let appIdList = props.appIds | |||
| // console.log(props.appIds) | |||
| // console.log(appIdList) | |||
| HttpUtils.post({ | |||
| url: UrlUtils.PAYMENT_CHECK, | |||
| params: { | |||
| appIds: appIdList | |||
| }, | |||
| onSuccess: (responseData) => { | |||
| const latestData = {}; | |||
| responseData.forEach(item => { | |||
| const { appId, timeDiff } = item; | |||
| if (latestData[appId] === undefined || timeDiff < latestData[appId].timeDiff) { | |||
| latestData[appId] = item; | |||
| } | |||
| }); | |||
| const latestDataObjects = Object.values(latestData); | |||
| const filteredData = latestDataObjects.filter(item => item.timeDiff > 20 && item.status !== "APPR"); | |||
| const filteredAppIds = filteredData.map(item => item.appId); | |||
| const appIdsNotInData = appIdList.filter(appId => !latestDataObjects.some(item => item.appId === appId)); | |||
| const combinedAppIdsArray = [...appIdsNotInData, ...filteredAppIds]; | |||
| const readyToPayment = appIdList.every(appId => combinedAppIdsArray.includes(appId)); | |||
| if (readyToPayment){ | |||
| // props.setConfirmPayment(true); | |||
| return; | |||
| }else{ | |||
| const appIdsInData = appIdList.filter(appId => !combinedAppIdsArray.some(item => item === appId)); | |||
| const HoldingApplication = latestDataObjects.filter(item => appIdsInData.includes(item.appId)); | |||
| const resultString = HoldingApplication.map(item => item.appNo).join(' , '); | |||
| setPaymentHoldedErrText(resultString); | |||
| // setPaymentHoldedErrText(intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: record.appNo })); | |||
| setPaymentHoldedErr(true); | |||
| } | |||
| } | |||
| }); | |||
| }; | |||
| const closeHandle = () => () =>{ | |||
| @@ -387,10 +434,37 @@ const MultiPaymentWindow = (props) => { | |||
| </DialogActions> | |||
| <DialogActions> | |||
| <Button variant="contained" color="success" onClick={confirmPaymentHandle()} disabled={paymentMethod === "" || isLimit || isPPSLimit}> | |||
| <FormattedMessage id="confirm"/> | |||
| <FormattedMessage id="pay"/> | |||
| </Button> | |||
| </DialogActions> | |||
| </Stack> | |||
| <div> | |||
| <Dialog | |||
| open={paymentHoldedErr} | |||
| onClose={() => setPaymentHoldedErr(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle></DialogTitle> | |||
| <Typography variant="h4" style={{ paddingLeft: '24px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Stack direction="column" justifyContent="space-between"> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: paymentHoldedErrText }) }} /> | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setPaymentHoldedErr(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </Dialog> | |||
| ); | |||
| }; | |||
| @@ -157,12 +157,12 @@ const Index = () => { | |||
| }); | |||
| } | |||
| // //For testing | |||
| //For testing | |||
| // if (paymentMethod != "") { | |||
| // HttpUtils.post({ | |||
| // url: UrlUtils.PAYMENT_CREATE, | |||
| // params: { | |||
| // transNo: "test0001", | |||
| // transNo: "test0002", | |||
| // payMethod: paymentMethod, | |||
| // payAmount: totalAmount, | |||
| // appIdList: location.state?.appIdList ?? [] | |||
| @@ -209,18 +209,18 @@ const Index = () => { | |||
| } | |||
| }); | |||
| // HttpUtils.get({ | |||
| // url: UrlUtils.PAYMENT_LIMIT_SETTING_LIST, | |||
| // params: {}, | |||
| // onSuccess: (responseData) => { | |||
| // // console.log(responseData) | |||
| // setPaymentLimit(responseData) | |||
| HttpUtils.get({ | |||
| url: UrlUtils.PAYMENT_LIMIT_SETTING_LIST, | |||
| params: {}, | |||
| onSuccess: (responseData) => { | |||
| // console.log(responseData) | |||
| setPaymentLimit(responseData) | |||
| // }, | |||
| // onError: () =>{ | |||
| // // setOnReady(true) | |||
| // } | |||
| // }); | |||
| }, | |||
| onError: () =>{ | |||
| // setOnReady(true) | |||
| } | |||
| }); | |||
| // const responseData = { | |||
| // "availablepaymentmethods": [ | |||
| @@ -540,6 +540,8 @@ const Index = () => { | |||
| onReady = {onReady} | |||
| locale = {locale} | |||
| isFullScreen={isFullScreen} | |||
| appIds={appIds} | |||
| // appNo={itemList.appNo} | |||
| /> | |||
| </Grid > | |||
| ); | |||
| @@ -37,6 +37,9 @@ const FormPanel = ({ formData }) => { | |||
| const [saving, setSaving] = React.useState(false); | |||
| const [proofPaymentDeadlineMin, setProofPaymentDeadlineMin] = React.useState({}); | |||
| const [reviseDeadlineMin, setReviseDeadlineMin] = React.useState({}); | |||
| const navigate = useNavigate() | |||
| React.useEffect(() => { | |||
| @@ -46,6 +49,8 @@ const FormPanel = ({ formData }) => { | |||
| setColumnPrice(ComboData.proofPrice[1]) | |||
| formData['length'] = 18; | |||
| } | |||
| setProofPaymentDeadlineMin(formData.proofPaymentDeadline); | |||
| setReviseDeadlineMin(formData.reviseDeadline); | |||
| } | |||
| }, [formData]); | |||
| @@ -206,6 +211,7 @@ const FormPanel = ({ formData }) => { | |||
| onChange={formik.handleChange} | |||
| name="reviseDeadline" | |||
| value={formik.values["reviseDeadline"]} | |||
| InputProps={{ inputProps: { min: DateUtils.datetimeStr(reviseDeadlineMin) } }} | |||
| variant="outlined" | |||
| sx={ | |||
| { | |||
| @@ -232,6 +238,7 @@ const FormPanel = ({ formData }) => { | |||
| onChange={formik.handleChange} | |||
| name="proofPaymentDeadline" | |||
| value={formik.values["proofPaymentDeadline"]} | |||
| InputProps={{ inputProps: { min: DateUtils.datetimeStr(proofPaymentDeadlineMin) } }} | |||
| variant="outlined" | |||
| sx={ | |||
| { | |||
| @@ -45,6 +45,8 @@ const Index = () => { | |||
| const [record, setRecord] = React.useState({}); | |||
| const [onReady, setOnReady] = React.useState(false); | |||
| const [isPopUp, setIsPopUp] = useState(false); | |||
| const [paymentHoldedErrText, setPaymentHoldedErrText] = React.useState(""); | |||
| const [paymentHoldedErr, setPaymentHoldedErr] = React.useState(false); | |||
| const intl = useIntl(); | |||
| @@ -77,9 +79,48 @@ const Index = () => { | |||
| function doPayment() { | |||
| setIsPopUp(false); | |||
| navigate('/paymentPage', { state: { amount: fee, appIdList: [record?.appId] } }); | |||
| let appIdList = [record?.appId] | |||
| handlePaymentCheck(appIdList) | |||
| } | |||
| const handlePaymentCheck = (appIdList) => { | |||
| HttpUtils.post({ | |||
| url: UrlUtils.PAYMENT_CHECK, | |||
| params: { | |||
| appIds: appIdList | |||
| }, | |||
| onSuccess: (responseData) => { | |||
| const latestData = {}; | |||
| responseData.forEach(item => { | |||
| const { appId, timeDiff } = item; | |||
| if (latestData[appId] === undefined || timeDiff < latestData[appId].timeDiff) { | |||
| latestData[appId] = item; | |||
| } | |||
| }); | |||
| const latestDataObjects = Object.values(latestData); | |||
| const filteredData = latestDataObjects.filter(item => item.timeDiff > 20 && item.status !== "APPR"); | |||
| const filteredAppIds = filteredData.map(item => item.appId); | |||
| const appIdsNotInData = appIdList.filter(appId => !latestDataObjects.some(item => item.appId === appId)); | |||
| const combinedAppIdsArray = [...appIdsNotInData, ...filteredAppIds]; | |||
| const readyToPayment = appIdList.every(appId => combinedAppIdsArray.includes(appId)); | |||
| if (readyToPayment){ | |||
| navigate('/paymentPage', { state: { amount: fee, appIdList: appIdList } }); | |||
| }else{ | |||
| const appIdsInData = appIdList.filter(appId => !combinedAppIdsArray.some(item => item === appId)); | |||
| const HoldingApplication = latestDataObjects.filter(item => appIdsInData.includes(item.appId)); | |||
| const resultString = HoldingApplication.map(item => item.appNo).join(' , '); | |||
| setPaymentHoldedErrText(resultString); | |||
| // setPaymentHoldedErrText(intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: record.appNo })); | |||
| setPaymentHoldedErr(true); | |||
| } | |||
| } | |||
| }); | |||
| }; | |||
| return ( | |||
| !onReady ? | |||
| <Grid container sx={{ minHeight: '87vh', mb: 3 }} direction="column" justifyContent="center" alignItems="center"> | |||
| @@ -200,6 +241,33 @@ const Index = () => { | |||
| </Dialog> | |||
| </div> | |||
| {/*row 2*/} | |||
| <div> | |||
| <Dialog | |||
| open={paymentHoldedErr} | |||
| onClose={() => setPaymentHoldedErr(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle></DialogTitle> | |||
| <Typography variant="h4" style={{ paddingLeft: '24px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Stack direction="column" justifyContent="space-between"> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: paymentHoldedErrText }) }} /> | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setPaymentHoldedErr(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </Grid > | |||
| @@ -139,7 +139,7 @@ const ApplicationDetailCard = ({ | |||
| <Grid container alignItems={"center"}> | |||
| <Grid item xs={12} md={3} lg={3} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <FormLabel><Typography variant="h5">App No.:</Typography></FormLabel> | |||
| <FormLabel><Typography variant="h5">App. No.:</Typography></FormLabel> | |||
| </Grid> | |||
| <Grid item xs={12} md={9} lg={9}> | |||
| @@ -151,7 +151,7 @@ const ApplicationDetailCard = ({ | |||
| <Grid container alignItems={"left"}> | |||
| <Grid item xs={12} md={3} lg={3} | |||
| sx={{ display: 'flex', alignItems: 'center' }}> | |||
| <FormLabel><Typography variant="h5">Status:</Typography></FormLabel> | |||
| <FormLabel><Typography variant="h5">App. Status:</Typography></FormLabel> | |||
| </Grid> | |||
| <Grid item xs={12} md={9} lg={9} sx={{ display: 'flex', alignItems: 'center' }}> | |||
| @@ -278,7 +278,9 @@ const ApplicationDetailCard = ({ formData, }) => { | |||
| ? | |||
| <Typography variant="pnspsFormParagraph">( {data.noOfPages} {intl.formatMessage({id: 'page'})} x $6,552 )</Typography> | |||
| : | |||
| <Typography variant="pnspsFormParagraph">( {data.length} cm x {data.colCount === 2 ? "$364 二格位" : "$182 一格位"} )</Typography> | |||
| <Typography variant="pnspsFormParagraph">( {data.length} cm x {data.colCount === 2 ? | |||
| "$364 "+intl.formatMessage({id: 'doubleCol'}) : | |||
| "$182 "+intl.formatMessage({id: 'singleCol'})} )</Typography> | |||
| } | |||
| </Grid> | |||
| </Grid> | |||
| @@ -119,6 +119,7 @@ const GazetteDetailCard = ( | |||
| // size="large" | |||
| variant="contained" | |||
| onClick={groupDetailClick()} | |||
| disabled={applicationDetailData.data.status!="submitted"&&applicationDetailData.data.status!="reviewed"} | |||
| sx={{ | |||
| textTransform: 'capitalize', | |||
| alignItems: 'end' | |||
| @@ -52,6 +52,8 @@ const ApplicationDetailCard = ( | |||
| const [isPopUp, setIsPopUp] = useState(false); | |||
| const [errorText, setErrorText] = useState(""); | |||
| const [errorPopUp, setErrorPopUp] = useState(false); | |||
| const [paymentHoldedErrText, setPaymentHoldedErrText] = React.useState(""); | |||
| const [paymentHoldedErr, setPaymentHoldedErr] = React.useState(false); | |||
| // const params = useParams(); | |||
| const [currentApplicationDetailData, setCurrentApplicationDetailData] = useState({}); | |||
| const [fee, setFee] = useState(0); | |||
| @@ -113,7 +115,8 @@ const ApplicationDetailCard = ( | |||
| }, | |||
| onSuccess: (responData) => { | |||
| if (responData.success == true) { | |||
| setIsPopUp(true); | |||
| let appIdList = [currentApplicationDetailData.id] | |||
| handlePaymentCheck(appIdList) | |||
| return; | |||
| } | |||
| setErrorText("公共啟事申請已過期"); | |||
| @@ -125,9 +128,49 @@ const ApplicationDetailCard = ( | |||
| function doPayment() { | |||
| setIsPopUp(false); | |||
| navigate('/paymentPage', { state: { amount: fee, appIdList: [currentApplicationDetailData.id] } }); | |||
| let appIdList = [currentApplicationDetailData.id] | |||
| navigate('/paymentPage', { state: { amount: fee, appIdList: appIdList } }); | |||
| } | |||
| const handlePaymentCheck = (appIdList) => { | |||
| HttpUtils.post({ | |||
| url: UrlUtils.PAYMENT_CHECK, | |||
| params: { | |||
| appIds: appIdList | |||
| }, | |||
| onSuccess: (responseData) => { | |||
| const latestData = {}; | |||
| responseData.forEach(item => { | |||
| const { appId, timeDiff } = item; | |||
| if (latestData[appId] === undefined || timeDiff < latestData[appId].timeDiff) { | |||
| latestData[appId] = item; | |||
| } | |||
| }); | |||
| const latestDataObjects = Object.values(latestData); | |||
| const filteredData = latestDataObjects.filter(item => item.timeDiff > 20 && item.status !== "APPR"); | |||
| const filteredAppIds = filteredData.map(item => item.appId); | |||
| const appIdsNotInData = appIdList.filter(appId => !latestDataObjects.some(item => item.appId === appId)); | |||
| const combinedAppIdsArray = [...appIdsNotInData, ...filteredAppIds]; | |||
| const readyToPayment = appIdList.every(appId => combinedAppIdsArray.includes(appId)); | |||
| if (readyToPayment){ | |||
| setIsPopUp(true); | |||
| return; | |||
| }else{ | |||
| const appIdsInData = appIdList.filter(appId => !combinedAppIdsArray.some(item => item === appId)); | |||
| const HoldingApplication = latestDataObjects.filter(item => appIdsInData.includes(item.appId)); | |||
| const resultString = HoldingApplication.map(item => item.appNo).join(' , '); | |||
| setPaymentHoldedErrText(resultString); | |||
| // setPaymentHoldedErrText(intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: record.appNo })); | |||
| setPaymentHoldedErr(true); | |||
| } | |||
| } | |||
| }); | |||
| }; | |||
| return ( | |||
| !onReady ? | |||
| <LoadingComponent /> | |||
| @@ -669,6 +712,33 @@ const ApplicationDetailCard = ( | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| <div> | |||
| <Dialog | |||
| open={paymentHoldedErr} | |||
| onClose={() => setPaymentHoldedErr(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle></DialogTitle> | |||
| <Typography variant="h4" style={{ paddingLeft: '24px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Stack direction="column" justifyContent="space-between"> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: paymentHoldedErrText }) }} /> | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setPaymentHoldedErr(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </form> | |||
| </MainCard > | |||
| ); | |||
| @@ -19,6 +19,8 @@ export default function SubmittedTab({ rows }) { | |||
| const theme = useTheme(); | |||
| const isMdOrLg = useMediaQuery(theme.breakpoints.up('md')); | |||
| const intl = useIntl(); | |||
| const { locale } = intl; | |||
| const handleEditClick = (params) => () => { | |||
| navigate('/paymentPage/details/' + params.row.id); | |||
| @@ -52,7 +54,7 @@ export default function SubmittedTab({ rows }) { | |||
| width: isMdOrLg ? 'auto' : 160, | |||
| flex: isMdOrLg ? 1 : undefined, | |||
| renderCell: (params) => { | |||
| return PaymentStatus.getStatus_Cht(params); | |||
| return locale === 'en' ? PaymentStatus.getStatus_Eng(params):PaymentStatus.getStatus_Cht(params); | |||
| } | |||
| }, | |||
| { | |||
| @@ -34,6 +34,10 @@ export default function SubmittedTab({ rows }) { | |||
| const [selectedCareOf, setSelectedCareOf] = React.useState(null); | |||
| const [expiryDateErrText, setExpiryDateErrText] = React.useState(""); | |||
| const [expiryDateErr, setExpiryDateErr] = React.useState(false); | |||
| const [paymentHoldedErrText, setPaymentHoldedErrText] = React.useState(""); | |||
| const [paymentHoldedErr, setPaymentHoldedErr] = React.useState(false); | |||
| const theme = useTheme(); | |||
| const isMdOrLg = useMediaQuery(theme.breakpoints.up('md')); | |||
| const intl = useIntl(); | |||
| @@ -103,7 +107,8 @@ export default function SubmittedTab({ rows }) { | |||
| }, | |||
| onSuccess: (responData) => { | |||
| if (responData.success == true) { | |||
| setIsPopUp(true); | |||
| // setIsPopUp(true); | |||
| handlePaymentCheck(appIdList) | |||
| return; | |||
| } | |||
| let str = ""; | |||
| @@ -114,8 +119,45 @@ export default function SubmittedTab({ rows }) { | |||
| setExpiryDateErr(true); | |||
| } | |||
| }); | |||
| }; | |||
| const handlePaymentCheck = (appIdList) => { | |||
| HttpUtils.post({ | |||
| url: UrlUtils.PAYMENT_CHECK, | |||
| params: { | |||
| appIds: appIdList | |||
| }, | |||
| onSuccess: (responseData) => { | |||
| const latestData = {}; | |||
| responseData.forEach(item => { | |||
| const { appId, timeDiff } = item; | |||
| if (latestData[appId] === undefined || timeDiff < latestData[appId].timeDiff) { | |||
| latestData[appId] = item; | |||
| } | |||
| }); | |||
| const latestDataObjects = Object.values(latestData); | |||
| const filteredData = latestDataObjects.filter(item => item.timeDiff > 20 && item.status !== "APPR"); | |||
| const filteredAppIds = filteredData.map(item => item.appId); | |||
| const appIdsNotInData = appIdList.filter(appId => !latestDataObjects.some(item => item.appId === appId)); | |||
| const combinedAppIdsArray = [...appIdsNotInData, ...filteredAppIds]; | |||
| const readyToPayment = appIdList.every(appId => combinedAppIdsArray.includes(appId)); | |||
| if (readyToPayment){ | |||
| setIsPopUp(true); | |||
| return; | |||
| }else{ | |||
| const appIdsInData = appIdList.filter(appId => !combinedAppIdsArray.some(item => item === appId)); | |||
| const HoldingApplication = latestDataObjects.filter(item => appIdsInData.includes(item.appId)); | |||
| const resultString = HoldingApplication.map(item => item.appNo).join(' , '); | |||
| setPaymentHoldedErrText(resultString); | |||
| // setPaymentHoldedErrText(intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: record.appNo })); | |||
| setPaymentHoldedErr(true); | |||
| } | |||
| } | |||
| }); | |||
| }; | |||
| const columns = [ | |||
| @@ -405,6 +447,33 @@ export default function SubmittedTab({ rows }) { | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| <div> | |||
| <Dialog | |||
| open={paymentHoldedErr} | |||
| onClose={() => setPaymentHoldedErr(false)} | |||
| PaperProps={{ | |||
| sx: { | |||
| minWidth: '40vw', | |||
| maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' }, | |||
| maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' } | |||
| } | |||
| }} | |||
| > | |||
| <DialogTitle></DialogTitle> | |||
| <Typography variant="h4" style={{ paddingLeft: '24px' }}><FormattedMessage id="MSG.actionFail" /></Typography> | |||
| <DialogContent style={{ display: 'flex', }}> | |||
| <Stack direction="column" justifyContent="space-between"> | |||
| <div dangerouslySetInnerHTML={{ __html: intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: paymentHoldedErrText }) }} /> | |||
| </Stack> | |||
| </DialogContent> | |||
| <DialogActions> | |||
| <Button onClick={() => setPaymentHoldedErr(false)} aria-label={intl.formatMessage({ id: 'close' })}> | |||
| <Typography variant="h5"> | |||
| <FormattedMessage id="close" /> | |||
| </Typography></Button> | |||
| </DialogActions> | |||
| </Dialog> | |||
| </div> | |||
| </> | |||
| ); | |||
| @@ -303,13 +303,13 @@ const CustomFormWizard = (props) => { | |||
| selectedAddress4, selectedAddress5, | |||
| termsAndConAccept, termsAndConNotAccept, fileList]) | |||
| useEffect(()=>{ | |||
| useEffect(() => { | |||
| setDistrictErrStr(""); | |||
| if(selectedAddress5?.type === "hongKong"){ | |||
| if(selectedAddress4 ==null || selectedAddress4 == ""|| selectedAddress4 == {}) | |||
| if (selectedAddress5?.type === "hongKong") { | |||
| if (selectedAddress4 == null || selectedAddress4 == "" || selectedAddress4 == {}) | |||
| setDistrictErrStr(getRequiredErrStr("district")) | |||
| } | |||
| },[selectedAddress4, selectedAddress5]) | |||
| }, [selectedAddress4, selectedAddress5]) | |||
| useEffect(() => { | |||
| props.step == 2 ? _onSubmit() : null; | |||
| @@ -541,11 +541,11 @@ const CustomFormWizard = (props) => { | |||
| return <Typography variant="errorMessage1">{errorMsg}</Typography> | |||
| } | |||
| function getMaxErrStr(num, fieldname){ | |||
| return displayErrorMsg(intl.formatMessage({ id: 'noMoreThenNWords' },{num:num, fieldname:fieldname?intl.formatMessage({ id: fieldname})+": ":""})); | |||
| function getMaxErrStr(num, fieldname) { | |||
| return displayErrorMsg(intl.formatMessage({ id: 'noMoreThenNWords' }, { num: num, fieldname: fieldname ? intl.formatMessage({ id: fieldname }) + ": " : "" })); | |||
| } | |||
| function getRequiredErrStr(fieldname){ | |||
| return displayErrorMsg(intl.formatMessage({ id: 'require'},{fieldname:fieldname?intl.formatMessage({ id: fieldname}):""})); | |||
| function getRequiredErrStr(fieldname) { | |||
| return displayErrorMsg(intl.formatMessage({ id: 'require' }, { fieldname: fieldname ? intl.formatMessage({ id: fieldname }) : "" })); | |||
| } | |||
| const formik = useFormik({ | |||
| @@ -581,14 +581,17 @@ const CustomFormWizard = (props) => { | |||
| .matches(/^(?=.*[0-9])/, { message: displayErrorMsg(intl.formatMessage({ id: 'atLeast1Number' })) }) | |||
| .matches(/^(?=.*[!@#%&])/, { message: displayErrorMsg(intl.formatMessage({ id: 'atLeast1SpecialChar' })) }), | |||
| confirmPassword: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'atLeast8CharPassword' }))).required(displayErrorMsg(intl.formatMessage({ id: 'pleaseConfirmPassword' }))).oneOf([yup.ref('password'), null], displayErrorMsg(intl.formatMessage({ id: 'samePassword' }))), | |||
| enName: yup.string().max(40, getMaxErrStr(40)).required(displayErrorMsg(intl.formatMessage({ id: 'userRequireEnglishName' }))), | |||
| chName: yup.string().max(6, getMaxErrStr(6)).required(displayErrorMsg(intl.formatMessage({ id: 'userRequireChineseName' }))), | |||
| enName: yup.string().max(40, getMaxErrStr(40)), | |||
| chName: yup.string().max(6, getMaxErrStr(6)).when('enName', { | |||
| is: (enName) => enName?false:true, | |||
| then: yup.string().required(displayErrorMsg(intl.formatMessage({ id: 'userRequireChineseName' }))) | |||
| }), | |||
| address1: yup.string().max(40, getMaxErrStr(40, "addressLine1")).required(displayErrorMsg(intl.formatMessage({ id: 'validateAddressLine1' }))), | |||
| address2: yup.string().max(40, getMaxErrStr(40, "addressLine2")), | |||
| address3: yup.string().max(40, getMaxErrStr(40, "addressLine3")), | |||
| email: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))), | |||
| emailConfirm: yup.string().email(displayErrorMsg(intl.formatMessage({ id: 'validEmailFormat' }))).max(128, getMaxErrStr(128)).required(displayErrorMsg(intl.formatMessage({ id: 'requireEmail' }))).oneOf([yup.ref('email'), null], displayErrorMsg(intl.formatMessage({ id: 'validSameEmail' }))), | |||
| idNo: yup.string().required(displayErrorMsg(`${intl.formatMessage({ id: 'require' })}${selectedIdDocInputType}${intl.formatMessage({ id: 'number' })}`)) | |||
| idNo: yup.string().required(getRequiredErrStr('number')) | |||
| .matches(/^[aA-zZ0-9\s]+$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpecialCharacter' })}`) }) | |||
| .matches(/^\S*$/, { message: displayErrorMsg(`${selectedIdDocInputType}${intl.formatMessage({ id: 'noSpace' })}`) }) | |||
| .test('checkIDCardFormat', displayErrorMsg(`${intl.formatMessage({ id: 'requiredValid' })}${selectedIdDocInputType}${intl.formatMessage({ id: 'number' })}`), function (value) { | |||
| @@ -648,7 +651,7 @@ const CustomFormWizard = (props) => { | |||
| // faxCountryCode: yup.string().min(3,'請輸入3位數字'), | |||
| phone: yup.string().min(8, displayErrorMsg(intl.formatMessage({ id: 'requireAtLeast8Number' }))).required(displayErrorMsg(intl.formatMessage({ id: 'requireContactNumber' }))), | |||
| // fax: yup.string().min(8,'請輸入8位數字'), | |||
| captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')), | |||
| captchaField: yup.string().max(5, getMaxErrStr(5)).required(displayErrorMsg(intl.formatMessage({ id: 'requireVerify' }))),//.oneOf([captcha], displayErrorMsg('請輸入有效驗證')), | |||
| }), | |||
| }); | |||
| @@ -934,7 +937,7 @@ const CustomFormWizard = (props) => { | |||
| /> | |||
| {formik.touched.idDocType && ( | |||
| selectedIdDocType === null || selectedIdDocType?.type == null ? | |||
| <FormHelperText error id="helper-text-idDocType-signup" sx={{fontSize:16,fontWeight: 'bold',}}> | |||
| <FormHelperText error id="helper-text-idDocType-signup" sx={{ fontSize: 16, fontWeight: 'bold', }}> | |||
| <FormattedMessage id="requireIdDocType" /> | |||
| </FormHelperText> : '' | |||
| )} | |||
| @@ -1067,12 +1070,17 @@ const CustomFormWizard = (props) => { | |||
| } | |||
| </Grid> | |||
| </Grid> | |||
| <Grid item xs={12} md={12}> | |||
| <Typography variant="subtitle1"> | |||
| <FormattedMessage id="registerNameLabel" /> | |||
| </Typography> | |||
| </Grid> | |||
| <Grid item xs={12} md={6}> | |||
| <Stack spacing={1}> | |||
| <InputLabel htmlFor="enName-signup"> | |||
| <Typography variant="pnspsFormHeader"> | |||
| <FormattedMessage id="userEnglishName" /> | |||
| {selectedIdDocType.type === "CNID" ? "" : <span style={{ color: '#f10000' }}>*</span>} | |||
| {selectedIdDocType.type === "CNID" ? "" : <span style={{ color: '#f10000' }}></span>} | |||
| </Typography> | |||
| </InputLabel> | |||
| <OutlinedInput | |||
| @@ -1105,7 +1113,7 @@ const CustomFormWizard = (props) => { | |||
| <InputLabel htmlFor="chName-signup"> | |||
| <Typography variant="pnspsFormHeader"> | |||
| <FormattedMessage id="userChineseName" /> | |||
| <span style={{ color: '#f10000' }}>*</span> | |||
| <span style={{ color: '#f10000' }}></span> | |||
| </Typography> | |||
| </InputLabel> | |||
| <OutlinedInput | |||
| @@ -1199,7 +1207,7 @@ const CustomFormWizard = (props) => { | |||
| value={selectedAddress4} | |||
| options={ComboData.district} | |||
| disabled={checkCountry} | |||
| error={Boolean(districtErrStr!="")} | |||
| error={Boolean(districtErrStr != "")} | |||
| onBlur={formik.handleBlur} | |||
| getOptionLabel={(option) => option.type ? intl.formatMessage({ id: option.type }) : ""} | |||
| onChange={(event, newValue) => { | |||
| @@ -1252,7 +1260,7 @@ const CustomFormWizard = (props) => { | |||
| {formik.errors.address3} | |||
| </FormHelperText> | |||
| )} | |||
| {districtErrStr!= "" && ( | |||
| {districtErrStr != "" && ( | |||
| <FormHelperText error > | |||
| {districtErrStr} | |||
| </FormHelperText> | |||
| @@ -1685,8 +1693,8 @@ const CustomFormWizard = (props) => { | |||
| <FormattedMessage id="idDocType" />: | |||
| </Typography> | |||
| <Typography variant="pnspsFormHeader" name="preview-idDocType"> | |||
| {intl.formatMessage({ id: selectedIdDocType?.label??" " })} | |||
| {intl.formatMessage({ id: selectedIdDocType?.label ?? " " })} | |||
| </Typography> | |||
| </Stack> | |||
| </Grid> | |||
| @@ -20,13 +20,26 @@ const DashboardDefault = () => { | |||
| backgroundColor: '#0C489E', | |||
| backgroundPosition: 'right' | |||
| } | |||
| const getWelcomeMsg=()=>{ | |||
| var current = new Date() | |||
| var curHr = current.getHours() | |||
| if (curHr < 12) { | |||
| return "Good Morning" | |||
| } else if (curHr < 18) { | |||
| return "Good Afternoon" | |||
| } else { | |||
| //evening | |||
| return "Good Evening" | |||
| } | |||
| } | |||
| return ( | |||
| <Grid container sx={{minHeight: '87vh', backgroundColor: "backgroundColor.default"}} direction="column"> | |||
| <Grid item xs={12}> | |||
| <div style={BackgroundHead}> | |||
| <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center"> | |||
| <Typography ml={15} color='#FFF' variant="h4" sx={{display: { xs: 'none', sm: 'none', md: 'block' }}}> | |||
| Morning, {userData.fullenName} | |||
| {getWelcomeMsg()}, {userData.fullenName} | |||
| </Typography> | |||
| </Stack> | |||
| </div> | |||
| @@ -35,6 +35,22 @@ const DashboardDefault = () => { | |||
| backgroundColor: '#0C489E', | |||
| backgroundPosition: 'right' | |||
| } | |||
| const { locale } = intl; | |||
| const getWelcomeMsg=()=>{ | |||
| var current = new Date() | |||
| var curHr = current.getHours() | |||
| if (curHr < 12) { | |||
| return <FormattedMessage id="welcomeMsg_am" /> | |||
| } else if (curHr < 18) { | |||
| return <FormattedMessage id="welcomeMsg_pm" /> | |||
| } else { | |||
| return <FormattedMessage id="welcomeMsg_night" /> | |||
| } | |||
| } | |||
| return ( | |||
| <Grid container sx={{ minHeight: '87vh' }} direction="column"> | |||
| <Grid item xs={12} > | |||
| @@ -42,7 +58,7 @@ const DashboardDefault = () => { | |||
| <Stack direction="row" height='70px' justifyContent="flex-start" alignItems="center"> | |||
| {/* <Typography variant="h5">我的公共啟事</Typography> */} | |||
| <Typography color='#FFF' variant="h5" sx={{ ml: 10, display: { xs: 'none', sm: 'none', md: 'block' } }}> | |||
| {isORGLoggedIn() ? userData.fullenName : userData.fullchName}, <FormattedMessage id="welcomeMsg" /> | |||
| {isORGLoggedIn() ? userData.fullenName: (locale === 'en' ?userData.fullenName: userData.fullchName)}, {getWelcomeMsg()} | |||
| </Typography> | |||
| </Stack> | |||
| </div> | |||
| @@ -67,6 +67,7 @@ | |||
| "MSG.proofOutOfTime": "Response out of time, please apply again.", | |||
| "MSG.plzSelectApp": "Please select application", | |||
| "MSG.actionFail": "Action failed", | |||
| "MSG.paymentHolded": "Application number {appNo} is currently in the process of payment. If the payment is unsuccessful, please try again after 20 minutes. We apologise for any inconvenience caused.", | |||
| "registerTitle1": "Become", | |||
| "registerTitle2": "Gazette Notice", | |||
| @@ -96,7 +97,10 @@ | |||
| "onlinePaymentHistory": "Online Payment History", | |||
| "setting": "Settings", | |||
| "companyOrUserRecord": "Company/Institutional User Records", | |||
| "welcomeMsg": "Good afternoon! Please select the required service.", | |||
| "welcomeMsg_am": "Good morning! Please select the required service.", | |||
| "welcomeMsg_pm": "Good afternoon! Please select the required service.", | |||
| "welcomeMsg_night": "Good evening! Please select the required service.", | |||
| "login": "Login", | |||
| "logout": "Logout", | |||
| @@ -147,6 +151,7 @@ | |||
| "registerNewBusinessUser": "Apply as organisation/company user", | |||
| "becomeNewBusinessUser": "Become New Organisation/Company user", | |||
| "userName": "Username", | |||
| "registerNameLabel": "Please provide either an English name or a Chinese name, at a minimum.", | |||
| "userChineseName": "Chinese Name", | |||
| "userEnglishName": "English Name", | |||
| "userContactName": "Name", | |||
| @@ -256,7 +261,7 @@ | |||
| "mainlandIDCard": "Mainland ID card", | |||
| "proCert": "Professional Practice Certificate", | |||
| "idDocType": "Document Category", | |||
| "requireIdDocType": "Please enter the document type", | |||
| "requireIdDocType": "Please select the document type", | |||
| "idDocNumber": "ID number", | |||
| "requireIdDocNumber": "Please enter the document ID", | |||
| "requiredNumberInQuote": "Please enter the numbers or letters in brackets", | |||
| @@ -354,7 +359,7 @@ | |||
| "publicNoticeDetailTitle": "Public Notice Application Information", | |||
| "applyPerson": "Applicant", | |||
| "applyStatus": "Application Status", | |||
| "applyStatus": "App. Status", | |||
| "gazetteCount": "Gazette issues number", | |||
| "gazetteCount2" :"Gazette issues number / Remarks", | |||
| "gazetteCount2_1" :"Care Of / Remarks", | |||
| @@ -391,6 +396,8 @@ | |||
| "upload": "Upload", | |||
| "actionFail": "Action failed: Please check the content and submit the reply again", | |||
| "issueInvalidMsg": "Action failed: The Gazette Issue invalid, please apply again", | |||
| "singleCol":"Single Column", | |||
| "doubleCol":"Double Column", | |||
| "transactionNo": "Transaction number", | |||
| "transactionDate": "Transaction date", | |||
| @@ -436,7 +443,7 @@ | |||
| "noRecordFound": "No record found", | |||
| "rowsPerPage": "Rows Per Page", | |||
| "date" : "Date", | |||
| "keyword": "Key word", | |||
| "keyword": "Keyword", | |||
| "dateFrom": "Date(From)", | |||
| "dateTo": "Date(To)", | |||
| "of": "of", | |||
| @@ -66,7 +66,8 @@ | |||
| "MSG.proofOutOfTime": "回覆逾时,请重新申请。", | |||
| "MSG.plzSelectApp": "请选择公共启事。", | |||
| "MSG.actionFail": "行动失败", | |||
| "MSG.paymentHolded": "申请编号 {appNo} 已正在付款的流程中,如相关付款没有成功,请于20分钟后再尝试付款,不便之处,请见谅!", | |||
| "registerTitle1": "立即成为", | |||
| "registerTitle2": "宪报刊登公共启事", | |||
| "registerTitle3": "用户", | |||
| @@ -95,7 +96,9 @@ | |||
| "onlinePaymentHistory": "网上付款记录", | |||
| "setting": "设置", | |||
| "companyOrUserRecord": "公司/机构用户记录", | |||
| "welcomeMsg": "午安! 请选择所需服务。", | |||
| "welcomeMsg_am": "早安! 请选择所需服务。", | |||
| "welcomeMsg_pm": "午安! 请选择所需服务。", | |||
| "welcomeMsg_night": "晚安! 请选择所需服务。", | |||
| "login": "登录", | |||
| "logout": "登出", | |||
| @@ -142,6 +145,7 @@ | |||
| "registerNewBusinessUser": "申请机构/公司用户", | |||
| "becomeNewBusinessUser": "成为新的机构/公司用户", | |||
| "userName": "用户名称", | |||
| "registerNameLabel": "请至少输入英文姓名或中文姓名。", | |||
| "userChineseName": "中文姓名", | |||
| "userEnglishName": "英文姓名", | |||
| "userContactName": "姓名", | |||
| @@ -251,7 +255,7 @@ | |||
| "mainlandIDCard": "内地身份证", | |||
| "proCert": "专业执业证书", | |||
| "idDocType": "证件类别", | |||
| "requireIdDocType": "请输入证件类别", | |||
| "requireIdDocType": "请选择证件类别", | |||
| "idDocNumber": "证件号码", | |||
| "requireIdDocNumber": "请输入证件号码", | |||
| "requiredNumberInQuote": "请输入括号内的数字或字母", | |||
| @@ -386,6 +390,8 @@ | |||
| "upload": "上载", | |||
| "actionFail": "行动失败: 请检查内容并再次提交回覆", | |||
| "issueInvalidMsg": "行动失败: 无效宪报期数,请重新申请", | |||
| "singleCol":"一格位", | |||
| "doubleCol":"二格位", | |||
| "transactionNo": "交易号码", | |||
| "transactionDate": "交易日期", | |||
| @@ -66,6 +66,7 @@ | |||
| "MSG.proofOutOfTime": "回覆逾時,請重新申請。", | |||
| "MSG.plzSelectApp": "請選擇公共啟事。", | |||
| "MSG.actionFail": "行動失敗", | |||
| "MSG.paymentHolded": "申請編號 {appNo} 已正在付款的流程中,如相關付款沒有成功,請於20分鐘後再嘗試付款,不便之處,請見諒!", | |||
| "registerTitle1": "立即成為", | |||
| "registerTitle2": "憲報刊登公共啟事", | |||
| @@ -95,7 +96,9 @@ | |||
| "onlinePaymentHistory": "網上付款記錄", | |||
| "setting": "設定", | |||
| "companyOrUserRecord": "公司/機構用戶記錄", | |||
| "welcomeMsg": "午安! 請選擇所需服務。", | |||
| "welcomeMsg_am": "早安! 請選擇所需服務。", | |||
| "welcomeMsg_pm": "午安! 請選擇所需服務。", | |||
| "welcomeMsg_night": "晚安! 請選擇所需服務。", | |||
| "login": "登入", | |||
| "logout": "登出", | |||
| @@ -145,6 +148,7 @@ | |||
| "registerNewBusinessUser": "申請機構/公司用戶", | |||
| "becomeNewBusinessUser": "成為新的機構/公司用戶", | |||
| "userName": "用戶名稱", | |||
| "registerNameLabel": "請至少輸入英文姓名或中文姓名。", | |||
| "userChineseName": "中文姓名", | |||
| "userEnglishName": "英文姓名", | |||
| "userContactName": "姓名", | |||
| @@ -254,7 +258,7 @@ | |||
| "mainlandIDCard": "內地身份證", | |||
| "proCert": "專業執業證書", | |||
| "idDocType": "證件類別", | |||
| "requireIdDocType": "請輸入證件類別", | |||
| "requireIdDocType": "請選擇證件類別", | |||
| "idDocNumber": "證件號碼", | |||
| "requireIdDocNumber": "請輸入證件號碼", | |||
| "requiredNumberInQuote": "請輸入括號內的數字或字母", | |||
| @@ -389,6 +393,8 @@ | |||
| "upload": "上載", | |||
| "actionFail": "行動失敗: 請檢查內容並再次提交回覆", | |||
| "issueInvalidMsg": "行動失敗: 無效憲報期數,請重新申請", | |||
| "singleCol":"一格位", | |||
| "doubleCol":"二格位", | |||
| "transactionNo": "交易號碼", | |||
| "transactionDate": "交易日期", | |||
| @@ -133,12 +133,13 @@ export const PROOF_CHECK_PRICE = apiPath+'/proof/check-price';//GET | |||
| export const GET_PROOF_PAY = apiPath+'/proof/pay-details';//GET | |||
| export const CANCEL_PROOF = apiPath+'/proof/cancel';//GET | |||
| //payment | |||
| export const PAYMENT_CREATE = apiPath+'/payment/create';//POST | |||
| export const PAYMENT_SAVE = apiPath+'/payment/save';//POST | |||
| export const PAYMENT_LIST = apiPath+'/payment/list';//GET | |||
| export const PAYMENT_LOAD = apiPath+'/payment/load';//GET | |||
| export const PAYMENT_APP_LIST = apiPath+'/payment/applist';//POST | |||
| export const PAYMENT_CHECK = apiPath+'/payment/check-payment';//GET | |||
| export const PAYMENT_LIMIT_SETTING_LIST = apiPath+'/settings/payment';//GET | |||
| export const PAYMENT_AVAILABLE_PAYMENT = paymentPath+'/api/payment/availability';//POST | |||