{"version":3,"sources":["staffSummary/StaffSummaryRepository.tsx","staffSummary/dialog/StaffBudgetMaintenanceDailog.tsx","staffSummary/selectors/FinancialYearAutoComplete.tsx","staffSummary/modals/StaffNameBudgetDialog.tsx","staffSummary/modals/StaffBudgetMaintenanceModal.tsx","staffSummary/selectors/StaffSelectorAutoComplete.tsx","staffSummary/drawer/EditStaffBudgetDrawer.tsx","staffSummary/StaffTaskAction.tsx","staffSummary/StaffSummaryColumns.tsx"],"names":["retrieveStaffSummaryData","query","refreshData","onSuccess","onError","fetchPolicy","NameData","variables","offset","first","filter","includeInactive","then","results","data","catch","reason","retrieveStaffDailyBudgetsData","StaffDailyBudgetsQuery","staffGuid","startDate","endDate","CurrencySymbol","useStyles","makeStyles","theme","createStyles","root","loaderWrapper","display","justifyContent","padding","textField","width","buttonContainer","button","margin","spacing","minWidth","StaffBudgetMaintenanceDailog","props","moment","classes","required","label","value","undefined","mustBeNumber","isNaN","composeValidators","validators","reduce","error","validator","isLoading","onSubmitLoading","isFormChanged","showDiscard","state","setState","billableHoursPerDay","billableAmountPerDay","nonBillableHoursPerDay","feesBilledPerDay","feesCollectedPerDay","week","sunday","monday","tuesday","wednesday","thursday","friday","saturday","budgetForm","setBudgetForm","prevBudgetForm","prevState","updateStaffDialy","input","mutate","mutation","UpdateStaffDailyBudgetMutation","UpdateStaffDailyBudgetInput","onClose","Dialog","open","className","DialogBox","title","content","show","isAgree","agree","disAgreeLabel","agreeLabel","DialogTitle","DialogContent","dividers","size","onSubmit","values","form","console","log","monthRange","range","days","Array","from","by","staffDailyBudgetsInput","isDateRangeDisabled","push","staffId","budgetDate","format","toString","chargeableHours","nonChargeableHours","feesRecorded","feesBilled","feesCollected","forEach","it","index","weekday","initialValues","initialValuesEqual","keepDirtyOnReinitialize","subscription","submitting","pristine","validate","errors","parseInt","render","handleSubmit","id","onChange","Grid","container","item","xs","md","name","meta","placeholder","animateYearScrolling","autoOk","allowKeyboardControl","variant","touched","inputProps","autoComplete","InputLabelProps","shrink","helperText","disabled","validating","minDate","UserFeature","HasAccess","hasStaffBudgetProductionView","hasStaffBudgetProductionEdit","decimalScale","component","CurrencyInput","prefix","currency","hasStaffBudgetBillingsView","hasStaffBudgetBillingsEdit","hasStaffBudgetCollectionsView","hasStaffBudgetCollectionsEdit","FormControl","FormGroup","row","FormControlLabel","control","Checkbox","color","checked","labelPlacement","DialogActions","Button","type","onClick","actionButton","FinancialYearAutoComplete","options","budgetFinancialYearQuery","BUDGET_FINANCIAL_YEAR","loading","staffBudget","financialYearList","financialYear","map","source","description","tempValue","find","v","isCurrent","onSelection","handleChange","event","getInputProps","params","InputProps","endAdornment","Fragment","CircularProgress","multiple","Autocomplete","disablePortal","getOptionLabel","option","getOptionSelected","renderInput","TextField","fullWidth","renderOption","inputValue","matches","parts","part","key","style","fontWeight","highlight","text","position","hidden","radioGroup","flexDirection","radioIcon","BrandColors","TemplatePrimary","amountField","maxWidth","textAlign","weekWrapper","alignItems","flexFlow","paper","gridContainer","gridItem","flex","gridItem1","loadingWrapper","loadingTitle","fontStyle","paddingTop","textRight","StaffNameBudgetDialog","setOnSubmitLoading","setIsFormChanged","setShowDiscard","generateMonthLoading","setGenerateMonthLoading","formState","dateRange","financialType","annual","july","august","september","october","november","december","january","february","march","april","may","june","isSubcriptionTriggered","onReset","RadioComp","compProps","Radio","checkedIcon","onFinancialYear","formApi","selection","startMonth","toDate","endMonth","add","months","fetchStaffBudgets","refresh","STAFF_MONTHLY_BUDGETS_QUERY","financialYearStartDate","onDataRetrieved","staffMonthlyBudgetData","staffMonthlyBudgets","staffMonthlyBudget","staffWorkingDaysData","staffWorkingDays","totalFeesRecorded","totalFeesBilled","totalFeesCollected","isBillableHoursSame","isNonBillableHours","setConfig","batch","change","Object","keys","length","bugetPerMonth","every","billableHours","nonBillableHours","monthName","month","toLowerCase","monthStartDate","startOf","isChanged","parseFloat","billableFees","realisation","collectability","includes","Math","round","onChangeAnnualValue","field","split","tempDate","onChangeMonthlyValue","isChangedInputFieldName","replace","topLevelField","secondLevelField","realisationPercentage","collectabilityPercentage","defaultExclude","excludedProperty","omit","arrayOfValues","finacialCategory","selectedField","pick","isSame","onChangeAnnualFeesCollected","tempCollectabilityPercentage","onChangeAnnualFeesBilled","tempRealisationPercentage","onChangeAnnualFeesRecorded","onGetPercentage","suffix","hasOwnProperty","toLocaleLowerCase","onCheckboxChange","monthAndAnnualKeys","monthAndAnnual","financialCategory","LoadingDialog","secondaryTitle","displayCloseButton","staffName","callback","staffWorkingDaysInput","remainingProperty","monthlyBudgets","Map","set","monthlyInput","workingDaysInfput","monthlyBudgetsWithChanges","monthlyBudget","UPDATE_STAFF_MONTHLY_BUDGET_MUTATION","staffMonthlyBudgetInput","staffMonthlyBudgetsInput","annualObject","convertAnnualToArray","monthsObject","monthsObjectConvertToArray","totalRequired","convertErrorsToArray","tempTopLevelField","secondLevelFields","sm","lg","RadioGroup","Typography","weekdaysComponent","Divider","Paper","elevation","fieldProps","fixedDecimalScale","currencySymbol","onChangeValue","annualComponent","textTransform","monthlyComponent","enableBudgetSync","CalendarView","top","left","bottom","right","modalWrapper","calendarWrapper","closeButton","zIndex","backgroundColor","eventContentContainer","height","marginRight","calendarContainer","overflow","borderColor","boxShadow","weeklyTotalContainer","paddingLeft","flexShrink","fontSize","borderTop","borderLeft","borderRight","weeklyTotalContentWrapper","weeklyTotalContentContainer","weekLists","listStyleType","border","borderBottom","minHeight","totalMonth","marginTop","modalHeader","paddingBottom","iconButton","toggleButtonGroup","calendarControl","dateControl","labelWrapper","marginRigt","LightTooltip","withStyles","tooltip","palette","common","white","shadows","Tooltip","StaffBudgetMaintenanceModal","calendarRef","monethlyBudgetSubscriptionTriggered","setMonethlyBudgetSubscriptionTriggered","setEnableBudgetSync","staffBudgetSettingQuery","STAFF_BUDGET_SETTINGS_QUERY","notifyOnNetworkStatusChange","events","weekly","totalBillableHours","totalNonBillableHours","totalBillableFees","Date","isEditOpen","calendarStart","calendarEnd","endOf","formData","staffFinancialYearBudget","viewType","MONTH_VIEW","isAddStaffBudgets","isEnableBudgetSync","settings","applications","staffBudgetSettings","config","refetch","staffDailyBudgetNotificationObj","staffDailyBudgetNotification","staffMonthlyBudgetNotificationObj","staffMonthlyBudgetNotification","unsubscribe","subscribe","UPDATE_STAFF_MONTHLY_BUDGET_SUBSCRIPTION","next","updateStaffMonthlyBudgetNotification","status","message","staffDailyBudgetsParams","ononDataRetrieved","err","StaffDailyBudgetNotificationSubscription","updateStaffDailyBudgetNotification","sDate","eDate","subtract","weeks","staffFinancialYearBudgetData","staffDailyBudgets","staffDailyBudgetData","staffDailyBudget","budget","date","isSameOrAfter","isSameOrBefore","weekNumber","financialPeriodEndDate","financialPeriodStartDate","onClickStaffBudgetForm","isOpen","onAddStaffBudgets","formatHours","hoursExtracted","minutesExtracted","floor","minutes","padStart","Modal","symbol","IconButton","current","getApi","prevYear","prev","view","nextYear","today","ToggleButtonGroup","exclusive","calendarApi","DAY_VIEW","WEEK_VIEW","changeView","ToggleButton","plugins","initialView","headerToolbar","center","dateClick","arg","datesSet","start","end","eventContent","eventInfo","_def","extendedProps","selectable","selectMirror","dayMaxEvents","eventClick","clickInfo","fixedWeekCount","showNonCurrentDates","ref","StaffSelectorAutoComplete","staffQuery","STAFF_ROLE_QUERY","staffRoleList","staffRole","paperRoot","butotnContainer","EditStaffBudgetDrawer","useState","partyGuid","staffClassification","UPDATE_STAFF_MUTATION","updateStaff","updateStaffProperty","Drawer","anchor","updateFromRedView","initialFocusedDate","setHours","StaffTaskActionEnum","menuItem","menuIcon","StaffTaskAction","anchorRef","useRef","setIsLoading","setOpen","isBudgetFormOpen","isEditFormOpen","handleClose","contains","target","archorEvent","handleClickMenu","menu","Budget","onBudgetFormOpen","Edit","onEditFormOpen","onBudgetFormClosed","onCloseEditForm","handleListKeyDown","preventDefault","prevOpen","useEffect","focus","Popper","anchorEl","role","transition","marginLeft","TransitionProps","placement","Grow","transformOrigin","ClickAwayListener","onClickAway","MenuList","autoFocusItem","onKeyDown","hasStaffMaintenance","MenuItem","cellClassEnum","menuTabs","HasBudgetEditPermission","StaffSummaryColumns","ContextMenuStaff","headerName","cellStyle","pinned","suppressMenu","autoHeight","resizable","lockPosition","lockPinned","cellRendererFramework","cellClass","actionType","String","enableRowGroup","suppressSizeToFit","stringType","hide","dateType","Boolean","booleanType"],"mappings":"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","file":"static/js/main~79903ac7.4ae4ebf1.chunk.js","sourcesContent":["import gql from 'graphql-tag';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport { client } from '..';\r\n\r\nexport interface StaffSummaryQueryParams {\r\n offset: number; \r\n first: number;\r\n filter?: string; \r\n includeInactive: boolean;\r\n}\r\n\r\nexport interface StaffSummaryData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n party: Party;\r\n}\r\n\r\nexport interface Party {\r\n staffSummaries: StaffSummaries;\r\n}\r\n\r\nexport interface StaffSummaries {\r\n recordCount: number;\r\n staffSummaryActualCount: StaffSummaryActualCount;\r\n staffSummary: StaffSummary[];\r\n}\r\n\r\nexport interface StaffSummaryActualCount {\r\n actualRowCountForSearch: number;\r\n}\r\n\r\nexport interface StaffSummary {\r\n staffId: number;\r\n staffGuid: string;\r\n name: string | null;\r\n emailAddress: string | null;\r\n mobile: string | null;\r\n phone: string | null;\r\n staffRole: string | null;\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n office: string | null;\r\n department: string | null;\r\n team: string | null;\r\n}\r\n\r\nexport function retrieveStaffSummaryData(query: StaffSummaryQueryParams, \r\n refreshData: boolean,\r\n onSuccess: (data: StaffSummaryData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void)\r\n : void {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n client.query({\r\n query: NameData,\r\n variables: {\r\n offset: query.offset,\r\n first: query.first,\r\n filter: query.filter, \r\n includeInactive: query.includeInactive \r\n },\r\n fetchPolicy: fetchPolicy\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: any; }) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any ) => { onError(reason); }\r\n );\r\n}\r\n\r\nconst NameData = gql`\r\n query StaffSummaries($offset: Int, $first: Int, $filter: String, $includeInactive: Boolean) {\r\n party{\r\n staffSummaries(offset: $offset, first: $first, filter: $filter, includeInactive: $includeInactive){\r\n recordCount,\r\n staffSummaryActualCount{\r\n actualRowCountForSearch\r\n },\r\n staffSummary{\r\n staffId,\r\n staffGuid\r\n name,\r\n emailAddress,\r\n mobile,\r\n phone,\r\n staffRole\r\n startDate\r\n endDate,\r\n isLicensed,\r\n office,\r\n department,\r\n team\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport interface StaffDailyBudgetsParams {\r\n staffGuid: string | null;\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n}\r\nexport interface StaffDailyBudgetsData {\r\n loading?: boolean;\r\n networkStatus?: number;\r\n staffBudget: StaffBudget;\r\n}\r\n\r\nexport interface StaffBudget {\r\n staffDailyBudgets: StaffDailyBudgets;\r\n}\r\n\r\nexport interface StaffDailyBudgets {\r\n recordCount: number;\r\n staffDailyBudget: StaffDailyBudget[];\r\n staffFinancialYearBudget: StaffFinancialYearBudget;\r\n}\r\n\r\nexport interface StaffDailyBudget {\r\n id: number;\r\n staffGuid: string;\r\n budgetDate: Date;\r\n billableHours: string;\r\n nonBillableHours: string;\r\n feesBilled: number;\r\n feesCollected: number;\r\n billableFees: number;\r\n}\r\n\r\nexport interface StaffFinancialYearBudget {\r\n id: number;\r\n staffGuid: string;\r\n billableHours: string;\r\n nonBillableHours: string;\r\n feesBilled: number;\r\n feesCollected: number;\r\n billableFees: number;\r\n financialPeriodStartDate: Date;\r\n financialPeriodEndDate: Date;\r\n}\r\n\r\nexport function retrieveStaffDailyBudgetsData(query: StaffDailyBudgetsParams, \r\n refreshData: boolean,\r\n onSuccess: (data: StaffDailyBudgetsData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void)\r\n : void {\r\n var fetchPolicy: FetchPolicy = refreshData === true ? 'network-only' : 'cache-first';\r\n client.query({\r\n query: StaffDailyBudgetsQuery,\r\n variables: {\r\n staffGuid: query.staffGuid,\r\n startDate: query.startDate,\r\n endDate: query.endDate\r\n },\r\n fetchPolicy: fetchPolicy\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: any; }) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any ) => { onError(reason); }\r\n );\r\n}\r\n\r\nexport const StaffDailyBudgetsQuery = gql`\r\n query staffDailyBudgets($staffGuid: String, $startDate: DateTime, $endDate: DateTime) {\r\n staffBudget{\r\n staffDailyBudgets(staffGuid: $staffGuid, startDate: $startDate, endDate: $endDate){\r\n recordCount,\r\n staffFinancialYearBudget{\r\n id,\r\n staffGuid,\r\n financialPeriodStartDate,\r\n financialPeriodEndDate,\r\n billableHours,\r\n nonBillableHours,\r\n feesBilled,\r\n feesCollected,\r\n billableFees\r\n },\r\n staffDailyBudget{\r\n id,\r\n staffGuid,\r\n budgetDate,\r\n billableHours,\r\n nonBillableHours,\r\n feesBilled,\r\n feesCollected,\r\n billableFees\r\n }\r\n }\r\n }\r\n }\r\n`;\r\nexport interface CurrencySymbolData {\r\n options: Options;\r\n}\r\n\r\nexport interface Options {\r\n currencySymbol: CurrencySymbol;\r\n}\r\n\r\nexport interface CurrencySymbol {\r\n symbol: string;\r\n}\r\n\r\nexport const CurrencySymbol = gql`\r\n query CurrencySymbol {\r\n options {currencySymbol {symbol}}\r\n }\r\n`;","// tslint:disable-next-line: max-line-length\r\nimport { \r\n Button, \r\n Checkbox, \r\n createStyles, \r\n Dialog, \r\n DialogActions, \r\n DialogContent, \r\n DialogTitle, \r\n FormControl, \r\n FormControlLabel, \r\n FormGroup, \r\n Grid, \r\n makeStyles, \r\n Theme \r\n} from '@material-ui/core';\r\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker/DatePicker';\r\nimport { FormApi } from 'final-form';\r\nimport gql from 'graphql-tag';\r\nimport Moment from 'moment';\r\nimport { extendMoment } from 'moment-range';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { AnyObject, Field, Form, FormSpy } from 'react-final-form';\r\nimport { client } from '../..';\r\nimport { showNotification } from '../../App';\r\nimport { CurrencyInput2 } from '../../components/CurrencyInput';\r\nimport { RvLoader } from '../../components/Loader';\r\nimport DialogBox from '../../Dashboard/Component/DialogBox';\r\nimport { UserFeature, UserFeatureEnum } from '../../types/UserFeature';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {},\r\n loaderWrapper: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n padding: '20px 0',\r\n },\r\n textField: {\r\n width: '100%',\r\n },\r\n buttonContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n // paddingBottom: '20px'\r\n },\r\n button: {\r\n margin: theme.spacing(1),\r\n minWidth: '83px',\r\n },\r\n })\r\n);\r\n\r\ninterface StaffDailyBudgetsInput {\r\n staffDailyBudgetsInput: StaffDailyBudget[];\r\n}\r\ninterface StaffDailyBudget {\r\n staffId: string | null;\r\n budgetDate: string | null;\r\n chargeableHours: number | null;\r\n nonChargeableHours: number | null;\r\n feesRecorded: number | null;\r\n feesBilled: number | null;\r\n feesCollected: number | null;\r\n}\r\n\r\nexport interface StaffBudgetForm {\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n \r\n billableHoursPerDay: number | null;\r\n billableAmountPerDay: number | null;\r\n\r\n nonBillableHoursPerDay: number | null;\r\n\r\n feesBilledPerDay: number | null;\r\n feesCollectedPerDay: number | null;\r\n}\r\n\r\ninterface StaffBudgetMaintenanceDailogForm extends StaffBudgetForm {\r\n week: {\r\n sunday: boolean;\r\n monday: boolean;\r\n tuesday: boolean;\r\n wednesday: boolean;\r\n thursday: boolean;\r\n friday: boolean;\r\n saturday: boolean;\r\n };\r\n}\r\n\r\ninterface StaffBudgetMaintenanceDailogProps {\r\n open: boolean;\r\n onClose?: () => void;\r\n data: StaffBudgetForm;\r\n isDateRangeDisabled: boolean;\r\n currency: string;\r\n staffId: string;\r\n}\r\n\r\ninterface StaffBudgetMaintenanceDailogState {\r\n isLoading: boolean;\r\n onSubmitLoading: boolean;\r\n isFormChanged: boolean;\r\n showDiscard: boolean;\r\n}\r\n\r\nexport const StaffBudgetMaintenanceDailog: React.FC = ( props ) => {\r\n\r\n const moment = extendMoment(Moment);\r\n\r\n const classes = useStyles();\r\n \r\n // tslint:disable-next-line: no-any\r\n const required = (label: string) => (value: any) => (value !== undefined && value !== null ? undefined : `${label} is required`);\r\n\r\n // tslint:disable-next-line: no-any\r\n const mustBeNumber = (value: any) => (isNaN(value) ? 'Must be a number' : undefined);\r\n\r\n // tslint:disable-next-line: no-any\r\n const composeValidators = (...validators: any[]) => (value: any) => validators.reduce((error, validator) => error || validator(value), undefined);\r\n \r\n const [state, setState] = useState({\r\n isLoading: true,\r\n onSubmitLoading: false,\r\n isFormChanged: false,\r\n showDiscard: false,\r\n });\r\n\r\n const [budgetForm, setBudgetForm] = useState({\r\n startDate: props.data.startDate,\r\n endDate: props.data.endDate,\r\n billableHoursPerDay: props.data.billableHoursPerDay,\r\n billableAmountPerDay: props.data.billableAmountPerDay,\r\n nonBillableHoursPerDay: props.data.nonBillableHoursPerDay,\r\n feesBilledPerDay: props.data.feesBilledPerDay,\r\n feesCollectedPerDay: props.data.feesCollectedPerDay,\r\n week: {\r\n sunday: false,\r\n monday: true,\r\n tuesday: true,\r\n wednesday: true,\r\n thursday: true,\r\n friday: true,\r\n saturday: false,\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n setBudgetForm((prevBudgetForm) => {\r\n return {\r\n ...prevBudgetForm,\r\n startDate: props.data.startDate,\r\n endDate: props.data.endDate,\r\n billableHoursPerDay: props.data.billableHoursPerDay,\r\n billableAmountPerDay: props.data.billableAmountPerDay,\r\n nonBillableHoursPerDay: props.data.nonBillableHoursPerDay,\r\n feesBilledPerDay: props.data.feesBilledPerDay,\r\n feesCollectedPerDay: props.data.feesCollectedPerDay,\r\n };\r\n });\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isLoading: false\r\n };\r\n });\r\n }, [props.data]);\r\n\r\n const onSubmit = (form: FormApi, values: StaffBudgetMaintenanceDailogForm | AnyObject) => {\r\n // tslint:disable-next-line: no-console\r\n console.log('submit', values);\r\n\r\n const monthRange = moment.range(values.startDate, values.endDate);\r\n\r\n const days = Array.from(monthRange.by('day'));\r\n\r\n const staffDailyBudgetsInput: StaffDailyBudgetsInput = { staffDailyBudgetsInput: []};\r\n \r\n if (props.isDateRangeDisabled) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: moment(values.startDate).format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else {\r\n // update entire month\r\n days.forEach((it, index) => {\r\n if (values.week.sunday && it.weekday() === 0) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.monday && it.weekday() === 1) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.tuesday && it.weekday() === 2) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.wednesday && it.weekday() === 3) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.thursday && it.weekday() === 4) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.friday && it.weekday() === 5) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n } else if (values.week.saturday && it.weekday() === 6) {\r\n staffDailyBudgetsInput.staffDailyBudgetsInput.push({\r\n staffId: props.staffId,\r\n budgetDate: it.format('L').toString(),\r\n chargeableHours: values.billableHoursPerDay,\r\n nonChargeableHours: values.nonBillableHoursPerDay,\r\n feesRecorded: values.billableAmountPerDay,\r\n feesBilled: values.feesBilledPerDay,\r\n feesCollected: values.feesCollectedPerDay,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // tslint:disable-next-line: no-console\r\n console.log('staffDailyBudgetsInput', staffDailyBudgetsInput);\r\n updateStaffDialy(staffDailyBudgetsInput);\r\n \r\n };\r\n\r\n const updateStaffDialy = (input: StaffDailyBudgetsInput) => {\r\n\r\n client.mutate({\r\n mutation: UpdateStaffDailyBudgetMutation,\r\n variables: {\r\n UpdateStaffDailyBudgetInput: input\r\n },\r\n })\r\n // tslint:disable-next-line: no-any\r\n .then((results: { data: any; }) => { \r\n if (results.data) {\r\n if (results.data.error === null || results.data.error === undefined) {\r\n showNotification(null, 'Successfully submitted', 'info'); \r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n } else {\r\n showNotification('Failed to update staff daily budget.', results.data.error, 'error'); \r\n }\r\n } \r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any) => { showNotification('Failed to update staff daily budget.', reason, 'error'); }); \r\n };\r\n\r\n // const getInput = (input: StaffDailyBudgetsInput) => {\r\n // return {\r\n // input \r\n // };\r\n // };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onDiscardChanges = (agree: boolean) => {\r\n if (agree) {\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n } else {\r\n // showDiscard false\r\n // form.change('showDiscard', false);\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n showDiscard: false\r\n };\r\n });\r\n }\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onFormValueChanged = (changeProps: any) => {\r\n if (!changeProps.pristine) {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isFormChanged: true\r\n };\r\n });\r\n }\r\n };\r\n\r\n const onClose = () => {\r\n if (state.isFormChanged) {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n showDiscard: true\r\n };\r\n });\r\n } else {\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n }\r\n };\r\n\r\n const actionButton = (\r\n // tslint:disable-next-line: no-any\r\n form: FormApi,\r\n submitting: boolean,\r\n pristine: boolean,\r\n // tslint:disable-next-line: no-any\r\n values: StaffBudgetMaintenanceDailogForm\r\n ) => {\r\n return (\r\n
\r\n {/* */}\r\n
\r\n {\r\n // code here..\r\n }}\r\n disabled={submitting || pristine || state.onSubmitLoading}\r\n >\r\n Update\r\n \r\n
\r\n
\r\n \r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n Edit Budget\r\n {state.isLoading ? (\r\n \r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n ) => onSubmit(form, values)} \r\n initialValues={budgetForm}\r\n initialValuesEqual={() => true}\r\n keepDirtyOnReinitialize={true}\r\n subscription={{ submitting: true, pristine: true }}\r\n validate={(values) => {\r\n\r\n let errors = {\r\n billableHoursPerDay: '',\r\n nonBillableHoursPerDay: ''\r\n };\r\n\r\n let billableHoursPerDay = 0;\r\n let nonBillableHoursPerDay = 0;\r\n\r\n if (typeof values.billableHoursPerDay === 'string') {\r\n // tslint:disable-next-line: radix\r\n billableHoursPerDay = parseInt(values.billableHoursPerDay);\r\n } else {\r\n billableHoursPerDay = values.billableHoursPerDay ? values.billableHoursPerDay : 0;\r\n }\r\n\r\n if (typeof values.nonBillableHoursPerDay === 'string') {\r\n // tslint:disable-next-line: radix\r\n nonBillableHoursPerDay = parseInt(values.nonBillableHoursPerDay);\r\n } else {\r\n nonBillableHoursPerDay = values.nonBillableHoursPerDay ? values.nonBillableHoursPerDay : 0;\r\n }\r\n\r\n if (billableHoursPerDay + nonBillableHoursPerDay > 24) {\r\n errors.billableHoursPerDay = 'Combined total of Billable and Non Billable hours should not exceed 24 hours.';\r\n errors.nonBillableHoursPerDay = 'Combined total of Billable and Non Billable hours should not exceed 24 hours.';\r\n\r\n return errors;\r\n\r\n } else {\r\n return undefined;\r\n }\r\n }}\r\n render={({handleSubmit, form, submitting, pristine, values}) => (\r\n
\r\n {\r\n onFormValueChanged(props);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n {({ input, meta }) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }) => (\r\n \r\n {({ input, meta }) => (\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) && \r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionEdit) && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) && \r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsEdit) && (\r\n \r\n \r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) && \r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsEdit) && (\r\n \r\n \r\n \r\n )}\r\n {!!!props.isDateRangeDisabled && (\r\n \r\n \r\n {/* Label Placement */}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Sun\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Mon\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Tue\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Wed\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Thu\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Fri\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Sat\"\r\n />\r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {/* {printJson(values)} */}\r\n \r\n \r\n {actionButton(form, submitting, pristine, values)}\r\n \r\n \r\n )} \r\n />\r\n )}\r\n \r\n );\r\n};\r\n\r\n// tslint:disable-next-line: no-any\r\nexport function printJson(values: any) {\r\n if (values) {\r\n return (\r\n <>\r\n
\r\n                    {JSON.stringify(values, undefined, 2)}\r\n                
\r\n \r\n );\r\n } else {\r\n return (\r\n <>\r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }) => (\r\n
\r\n                            {JSON.stringify(values, undefined, 2)}\r\n                            {/*  */}\r\n                        
\r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nconst UpdateStaffDailyBudgetMutation = gql`\r\n mutation UpdateStaffDailyBudget($UpdateStaffDailyBudgetInput : UpdateStaffDailyBudgetInput) {\r\n updateStaffDailyBudget(input: $UpdateStaffDailyBudgetInput)\r\n }\r\n`;","import React, { useState, useEffect } from 'react';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\nimport { Autocomplete, RenderInputParams } from '@material-ui/lab';\r\nimport { TextField, CircularProgress } from '@material-ui/core';\r\nimport match from 'autosuggest-highlight/match';\r\nimport parse from 'autosuggest-highlight/parse';\r\nimport { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n minWidth: '200px',\r\n },\r\n })\r\n);\r\n\r\nexport interface FinancialYearItem extends IAutoCompleteItem, FinancialYear {}\r\n\r\ninterface FinancialYearAutoCompleteProps {\r\n disabled?: boolean;\r\n required?: boolean;\r\n multiple?: boolean;\r\n // tslint:disable-next-line: no-any\r\n value?: FinancialYearItem | any; // value only available in single select\r\n error?: boolean;\r\n onSelection?: (value: FinancialYearItem | FinancialYearItem[], name: string) => void;\r\n className?: string;\r\n helperText?: string;\r\n name?: string;\r\n label?: string;\r\n disablePortal?: boolean;\r\n}\r\n\r\ninterface FinancialYearAutoCompleteState {\r\n isLoading: boolean;\r\n // tslint:disable-next-line: no-any\r\n options: FinancialYearItem[];\r\n // tslint:disable-next-line: no-any\r\n value: FinancialYearItem | any;\r\n}\r\n\r\nexport const FinancialYearAutoComplete: React.FC = props => {\r\n\r\n const classes = useStyles();\r\n\r\n const [state, setState] = useState({\r\n isLoading: true,\r\n options: [],\r\n value: props.value\r\n });\r\n\r\n const budgetFinancialYearQuery = useQuery(BUDGET_FINANCIAL_YEAR);\r\n\r\n useEffect(() => {\r\n if (budgetFinancialYearQuery.data && !budgetFinancialYearQuery.loading && !budgetFinancialYearQuery.error) {\r\n\r\n const financialYear = budgetFinancialYearQuery.data ? budgetFinancialYearQuery.data.staffBudget.financialYearList.financialYear : [];\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n options: financialYear.map((source: FinancialYear) => ({...source, value: source.description, label: source.description })),\r\n // tslint:disable-next-line: no-any\r\n // value: financialYear.map((source: FinancialYear) => ({...source, value: source.description, label: source.description })).find((v: any) => v.isCurrent),\r\n isLoading: false\r\n };\r\n });\r\n }\r\n // tslint:disable-next-line: align\r\n }, [budgetFinancialYearQuery.data, budgetFinancialYearQuery.loading, budgetFinancialYearQuery.error]);\r\n\r\n useEffect(() => {\r\n setState((prevState) => {\r\n\r\n let tempValue = props.value;\r\n\r\n if (!tempValue) {\r\n // tslint:disable-next-line: no-any\r\n tempValue = state.options.find((v: any) => v.isCurrent);\r\n if (props.onSelection) {\r\n props.onSelection(tempValue, props.name ? props.name : 'financialYear');\r\n }\r\n }\r\n\r\n return {\r\n ...prevState,\r\n // tslint:disable-next-line: no-any\r\n value: tempValue\r\n };\r\n });\r\n // tslint:disable-next-line: align\r\n }, [props.value, state.options]);\r\n\r\n // tslint:disable-next-line: no-any\r\n const handleChange = (event: React.ChangeEvent<{}>, value: any) => {\r\n if (props.onSelection) {\r\n props.onSelection(value, props.name ? props.name : 'financialYear');\r\n }\r\n };\r\n\r\n const getInputProps = (params: RenderInputParams, isLoading?: boolean) => {\r\n return ({ \r\n ...params.InputProps,\r\n endAdornment: (\r\n \r\n {isLoading ? : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ), \r\n });\r\n };\r\n\r\n return (\r\n
\r\n { props.multiple ? \r\n (\r\n option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n const matches = match(option.label, inputValue);\r\n const parts = parse(option.label, matches);\r\n \r\n return (\r\n
\r\n {parts.map((part, index) => (\r\n \r\n {part.text}\r\n \r\n ))}\r\n
\r\n );\r\n }}\r\n />\r\n )\r\n :\r\n (\r\n option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n const matches = match(option.label, inputValue);\r\n const parts = parse(option.label, matches);\r\n \r\n return (\r\n
\r\n {parts.map((part, index) => (\r\n \r\n {part.text}\r\n \r\n ))}\r\n
\r\n );\r\n }}\r\n />\r\n )\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport interface FinancialYearData {\r\n staffBudget: StaffBudget;\r\n}\r\n\r\nexport interface StaffBudget {\r\n financialYearList: FinancialYearList;\r\n}\r\n\r\nexport interface FinancialYearList {\r\n recordCount: number;\r\n financialYear: FinancialYear[];\r\n}\r\n\r\nexport interface FinancialYear {\r\n id: number;\r\n startDate: Date;\r\n endDate: Date;\r\n description: string;\r\n isCurrent: boolean;\r\n}\r\n\r\nconst BUDGET_FINANCIAL_YEAR = gql`\r\n query budgetFinancialYear {\r\n staffBudget {\r\n financialYearList { \r\n recordCount,\r\n financialYear{\r\n id,\r\n startDate,\r\n endDate,\r\n description,\r\n isCurrent\r\n }\r\n }\r\n }\r\n }\r\n`;","/* eslint-disable react-hooks/exhaustive-deps */\r\n// tslint:disable-next-line: max-line-length\r\nimport { makeStyles, Theme, createStyles, Dialog, DialogTitle, DialogContent, DialogActions, Button, Grid, FormControl, FormGroup, FormControlLabel, Checkbox, Typography, RadioGroup, Radio, Divider, Paper, CircularProgress } from '@material-ui/core';\r\nimport { FormApi, SubmissionErrors } from 'final-form';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { AnyObject, Field, Form, FormSpy, FieldInputProps } from 'react-final-form';\r\nimport DialogBox from '../../Dashboard/Component/DialogBox';\r\nimport RadioButtonCheckedIcon from '@material-ui/icons/RadioButtonChecked';\r\nimport { mainTheme } from '../../Theme';\r\nimport { CurrencyInput2 } from '../../components/CurrencyInput';\r\nimport { FinancialYearAutoComplete, FinancialYearItem } from '../selectors/FinancialYearAutoComplete';\r\nimport { showNotification } from '../../App';\r\nimport Moment from 'moment';\r\nimport { extendMoment } from 'moment-range';\r\n// import { formatNumber } from '../../helpers/ChartHelper';\r\nimport _ from 'lodash';\r\nimport { formatNumber } from '../../helpers/ChartHelper';\r\nimport gql from 'graphql-tag';\r\nimport { client } from '../..';\r\nimport { FetchPolicy } from 'apollo-client';\r\nimport LoadingDialog from '../../components/LoadingDialog';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n position: 'relative',\r\n },\r\n buttonContainer: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n // paddingBottom: '20px'\r\n },\r\n button: {\r\n margin: theme.spacing(1),\r\n minWidth: '83px',\r\n },\r\n hidden: {\r\n display: 'none',\r\n },\r\n radioGroup: {\r\n flexDirection: 'row'\r\n },\r\n radioIcon: {\r\n color: mainTheme.BrandColors.TemplatePrimary\r\n },\r\n textField: {\r\n width: '100%'\r\n },\r\n amountField: {\r\n width: '100%',\r\n maxWidth: '100px',\r\n '& .MuiInputBase-input': {\r\n textAlign: 'right'\r\n }, \r\n '& .MuiFormHelperText-root': {\r\n textAlign: 'right'\r\n }\r\n },\r\n weekWrapper: {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n flexFlow: 'column wrap'\r\n },\r\n paper: {\r\n padding: '15px'\r\n },\r\n gridContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '0 -10px',\r\n },\r\n gridItem: {\r\n margin: '0 10px',\r\n flex: 1\r\n },\r\n gridItem1: {\r\n flex: 1\r\n },\r\n loadingWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexFlow: 'column wrap',\r\n width: '100%'\r\n },\r\n loadingTitle: {\r\n fontStyle: 'italic',\r\n paddingTop: '10px'\r\n },\r\n textRight: {\r\n textAlign: 'right'\r\n }\r\n })\r\n);\r\ninterface StaffNameBudgetDialogProps {\r\n open: boolean;\r\n onClose?: () => void;\r\n staffGuid: string;\r\n currencySymbol: string;\r\n staffName: string;\r\n isSubcriptionTriggered?: boolean;\r\n enableBudgetSync: boolean;\r\n}\r\n\r\ninterface FinancialCategory {\r\n monthStartDate?: string;\r\n billableHoursPerDay?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n nonBillableHoursPerDay?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n feesRecorded?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n feesBilled?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n feesCollected?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n realisation?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n collectability?: {\r\n value: number;\r\n isChanged: boolean;\r\n };\r\n}\r\n\r\ninterface StaffNameBudgetDialogForm {\r\n financialType: 'monthly' | 'annually';\r\n financialYear: FinancialYearItem | null;\r\n dateRange: Moment.Moment[];\r\n week: {\r\n sunday: boolean;\r\n monday: boolean;\r\n tuesday: boolean;\r\n wednesday: boolean;\r\n thursday: boolean;\r\n friday: boolean;\r\n saturday: boolean;\r\n };\r\n annual: FinancialCategory;\r\n july: FinancialCategory;\r\n august: FinancialCategory;\r\n september: FinancialCategory;\r\n october: FinancialCategory;\r\n november: FinancialCategory;\r\n december: FinancialCategory;\r\n january: FinancialCategory;\r\n february: FinancialCategory;\r\n march: FinancialCategory;\r\n april: FinancialCategory;\r\n may: FinancialCategory;\r\n june: FinancialCategory;\r\n}\r\n\r\nexport const StaffNameBudgetDialog: React.FC = (props) => {\r\n\r\n const classes = useStyles();\r\n\r\n const moment = extendMoment(Moment);\r\n\r\n const [onSubmitLoading, setOnSubmitLoading] = useState(false);\r\n\r\n const [isFormChanged, setIsFormChanged] = useState(false);\r\n\r\n const [showDiscard, setShowDiscard] = useState(false);\r\n\r\n const [generateMonthLoading, setGenerateMonthLoading] = useState(true);\r\n\r\n const [formState] = useState({\r\n dateRange: [],\r\n financialType: 'monthly',\r\n financialYear: null,\r\n week: {\r\n sunday: false,\r\n monday: true,\r\n tuesday: true,\r\n wednesday: true,\r\n thursday: true,\r\n friday: true,\r\n saturday: false,\r\n },\r\n annual: {},\r\n july: {},\r\n august: {},\r\n september: {},\r\n october: {},\r\n november: {},\r\n december: {},\r\n january: {},\r\n february: {},\r\n march: {},\r\n april: {},\r\n may: {},\r\n june: {},\r\n });\r\n\r\n useEffect(() => {\r\n // use to close the entry budget form when subscription triggered\r\n if (props.isSubcriptionTriggered === true) {\r\n setOnSubmitLoading(false);\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n }\r\n // tslint:disable-next-line: align\r\n }, [props.isSubcriptionTriggered]);\r\n\r\n const onClose = () => {\r\n if (isFormChanged) {\r\n setShowDiscard(true);\r\n } else {\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n }\r\n };\r\n\r\n const onReset = () => {\r\n // reset\r\n };\r\n\r\n const updateStaffDailBudget = (monthlyInput: StaffMonthlyBudgetsInput[], workingDaysInfput: StaffWorkingDaysInput) => {\r\n\r\n // tslint:disable-next-line: no-any\r\n client.mutate({\r\n mutation: UPDATE_STAFF_MONTHLY_BUDGET_MUTATION,\r\n variables: {\r\n staffGuid: props.staffGuid,\r\n staffMonthlyBudgetInput: {\r\n staffMonthlyBudgetsInput: monthlyInput\r\n },\r\n staffWorkingDaysInput: workingDaysInfput\r\n },\r\n })\r\n // tslint:disable-next-line: no-any\r\n .then((results: { data: any; }) => { \r\n if (results.data) {\r\n if (results.data.error === null || results.data.error === undefined) {\r\n showNotification(null, 'Successfully submitted', 'info'); \r\n\r\n // setOnSubmitLoading(false);\r\n\r\n // if (props.onClose) {\r\n // props.onClose();\r\n // }\r\n } else {\r\n showNotification('Failed to update staff daily budget.', results.data.error, 'error'); \r\n }\r\n } \r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any) => { showNotification('Failed to update staff daily budget.', reason, 'error'); }); \r\n };\r\n\r\n const onSubmit = (values: StaffNameBudgetDialogForm, form: FormApi, callback?: (errors?: SubmissionErrors) => void) => {\r\n \r\n setOnSubmitLoading(true);\r\n\r\n // less of all working days and put it on array\r\n // const allowedDays = [\r\n // values.week.monday ? 1 : undefined,\r\n // values.week.tuesday ? 2 : undefined,\r\n // values.week.wednesday ? 3 : undefined,\r\n // values.week.thursday ? 4 : undefined,\r\n // values.week.friday ? 5 : undefined,\r\n // values.week.saturday ? 6 : undefined,\r\n // values.week.sunday ? 7 : undefined\r\n // ].filter((tempVal: number) => tempVal !== undefined);\r\n\r\n // console.log('allowedDays', allowedDays);\r\n\r\n let staffWorkingDaysInput: StaffWorkingDaysInput = { \r\n financialYearStartDate: moment(values.financialYear!.startDate).format('YYYY-MM-DD'),\r\n monday: values.week.monday,\r\n tuesday: values.week.tuesday,\r\n wednesday: values.week.wednesday,\r\n thursday: values.week.thursday,\r\n friday: values.week.friday,\r\n saturday: values.week.saturday,\r\n sunday: values.week.sunday,\r\n };\r\n\r\n // object that need to remove just toget only the object for months and annually\r\n const defaultExclude = ['financialType', 'financialYear', 'week', 'dateRange'];\r\n\r\n // removed unuse property\r\n const remainingProperty = _.omit(values, [...defaultExclude]);\r\n\r\n let monthlyBudgets = new Map();\r\n\r\n monthlyBudgets.set('january', remainingProperty.january);\r\n monthlyBudgets.set('february', remainingProperty.february);\r\n monthlyBudgets.set('march', remainingProperty.march);\r\n monthlyBudgets.set('april', remainingProperty.april);\r\n monthlyBudgets.set('may', remainingProperty.may);\r\n monthlyBudgets.set('june', remainingProperty.june);\r\n monthlyBudgets.set('july', remainingProperty.july);\r\n monthlyBudgets.set('august', remainingProperty.august);\r\n monthlyBudgets.set('september', remainingProperty.september);\r\n monthlyBudgets.set('october', remainingProperty.october);\r\n monthlyBudgets.set('november', remainingProperty.november);\r\n monthlyBudgets.set('december', remainingProperty.december);\r\n\r\n // let monthlyBudgets = new Set([remainingProperty.january, remainingProperty.february, remainingProperty.march, remainingProperty.april, remainingProperty.may,\r\n // remainingProperty.june, remainingProperty.july, remainingProperty.august, remainingProperty.september, remainingProperty.october, remainingProperty.november,\r\n // remainingProperty.december]);\r\n\r\n let monthlyBudgetsWithChanges: StaffMonthlyBudgetsInput[] = []; \r\n\r\n monthlyBudgets.forEach((monthlyBudget, key) => {\r\n\r\n if (monthlyBudget?.billableHoursPerDay?.isChanged ||\r\n monthlyBudget?.nonBillableHoursPerDay?.isChanged ||\r\n monthlyBudget?.feesRecorded?.isChanged ||\r\n monthlyBudget?.feesBilled?.isChanged ||\r\n monthlyBudget?.feesCollected?.isChanged) {\r\n monthlyBudgetsWithChanges.push(\r\n {\r\n monthStartDate: monthlyBudget?.monthStartDate, // Get MonthStartDate\r\n chargeableHours: monthlyBudget?.billableHoursPerDay?.value,\r\n nonChargeableHours: monthlyBudget?.nonBillableHoursPerDay?.value,\r\n feesBilled: monthlyBudget?.feesBilled?.value,\r\n feesCollected: monthlyBudget?.feesCollected?.value,\r\n feesRecorded: monthlyBudget?.feesRecorded?.value\r\n });\r\n }\r\n });\r\n\r\n updateStaffDailBudget(monthlyBudgetsWithChanges, staffWorkingDaysInput);\r\n\r\n // We only need the months which are changed\r\n\r\n // extract all the months\r\n // values.dateRange.forEach((financialYearDate: Moment.Moment) => {\r\n // // get the first date of the month\r\n // const startMonthDate = moment(financialYearDate).startOf('month').toDate();\r\n // // get the last date of the month\r\n // const endMonthDate = moment(financialYearDate).endOf('month').toDate();\r\n \r\n // const monthRange = moment.range(startMonthDate, endMonthDate);\r\n\r\n // // get all days by from start to end date\r\n // const days = Array.from(monthRange.by('day'));\r\n\r\n // // get remaining days by week day selected\r\n // const remainingDays = days.filter((day: Moment.Moment) => allowedDays.includes(moment(day).isoWeekday()));\r\n\r\n // // console.log('remainingDays', remainingDays.length);\r\n\r\n // remainingDays.forEach((remainingDay: Moment.Moment) => {\r\n // // console.log('remainingDay', remainingDay);\r\n \r\n // // convert the date to selected format\r\n // const budgetDate = moment(remainingDay).format('MM/DD/YYYY');\r\n\r\n // // get the name of the month\r\n // const monthName = moment(financialYearDate).format('MMMM').toLowerCase();\r\n\r\n // const billableHoursPerDay = values[monthName].billableHoursPerDay;\r\n // const nonBillableHoursPerDay = values[monthName].nonBillableHoursPerDay;\r\n\r\n // // divide to ramaining days base on weekdays selected to get the fund per day\r\n // const feesRecorded = values[monthName].feesRecorded / remainingDays.length;\r\n // const feesBilled = values[monthName].feesBilled / remainingDays.length;\r\n // const feesCollected = values[monthName].feesCollected / remainingDays.length;\r\n\r\n // staffDailyBudgetInput.push({\r\n // budgetDate: budgetDate,\r\n // chargeableHours: billableHoursPerDay,\r\n // nonChargeableHours: nonBillableHoursPerDay,\r\n // feesBilled: feesBilled,\r\n // feesCollected: feesCollected,\r\n // feesRecorded: feesRecorded,\r\n // staffId: props.staffGuid\r\n // });\r\n\r\n // });\r\n // });\r\n\r\n };\r\n\r\n const onValidate = (values: StaffNameBudgetDialogForm) => {\r\n let errors = {\r\n annual: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n january: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n february: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n march: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n april: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n may: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n june: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n july: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n august: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n september: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n october: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n november: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n },\r\n december: {\r\n feesRecorded: {value: ''},\r\n feesBilled: {value: ''},\r\n feesCollected: {value: ''},\r\n billableHoursPerDay: {value: ''},\r\n nonBillableHoursPerDay: {value: ''},\r\n // realisation: '',\r\n // collectability: ''\r\n }\r\n };\r\n\r\n // object that need to remove just toget only the object for months and annually\r\n const defaultExclude = ['financialType', 'financialYear', 'week', 'dateRange'];\r\n\r\n // removed unuse property\r\n const remainingProperty = _.omit(errors, [...defaultExclude]);\r\n\r\n // annual validation\r\n if (values.financialType === 'annually') {\r\n\r\n // only get the annual in the object\r\n const annualObject = _.pick(remainingProperty, 'annual');\r\n \r\n if (annualObject.annual && Object.keys(annualObject.annual).length) {\r\n\r\n const convertAnnualToArray = Object.keys(annualObject.annual);\r\n \r\n let totalFieldEmpty = 0;\r\n\r\n // check 1 field from annual if has value \r\n convertAnnualToArray.forEach((financialCategory: string) => { \r\n // tslint:disable-next-line: max-line-length\r\n if (!values.annual.hasOwnProperty(financialCategory) || (values.annual[financialCategory] && values.annual[financialCategory].value === null) || (values.annual[financialCategory] && values.annual[financialCategory].value === undefined)) {\r\n totalFieldEmpty += 1;\r\n }\r\n });\r\n\r\n // extract financial category\r\n convertAnnualToArray.forEach((financialCategory: string) => { \r\n\r\n if (totalFieldEmpty >= 5) {\r\n errors.annual[financialCategory].value = '1 field is required';\r\n // tslint:disable-next-line: max-line-length\r\n } else if (values.annual[financialCategory] && values.annual[financialCategory].value > 24 && (financialCategory === 'billableHoursPerDay' || financialCategory === 'nonBillableHoursPerDay')) {\r\n errors.annual[financialCategory].value = `max is 24`;\r\n } \r\n // check if all field are not empty else return required\r\n // if (!(values.annual && Object.keys(values.annual).length)) {\r\n // errors.annual[financialCategory].value = 'required';\r\n // tslint:disable-next-line: max-line-length\r\n // } else if ((!values.annual.hasOwnProperty(financialCategory) || (values.annual[financialCategory] && values.annual[financialCategory].value === null) || (values.annual[financialCategory] && values.annual[financialCategory].value === undefined))) {\r\n // errors.annual[financialCategory].value = 'required';\r\n // tslint:disable-next-line: max-line-length\r\n // } else if (values.annual[financialCategory] && values.annual[financialCategory].value > 24 && (financialCategory === 'billableHoursPerDay' || financialCategory === 'nonBillableHoursPerDay')) {\r\n // errors.annual[financialCategory].value = `max is 24`;\r\n // }\r\n\r\n });\r\n }\r\n\r\n } else {\r\n\r\n /*\r\n * diabled validation for monthly for now\r\n */\r\n \r\n // remove annual and focus on monthly only\r\n const monthsObject = _.omit(remainingProperty, 'annual');\r\n\r\n // conver object to array\r\n const monthsObjectConvertToArray = Object.keys(monthsObject);\r\n\r\n monthsObjectConvertToArray.forEach((financialCategory: string) => { \r\n if (values.annual[financialCategory] && values.annual[financialCategory].value > 24 && (financialCategory === 'billableHoursPerDay' || financialCategory === 'nonBillableHoursPerDay')) {\r\n errors.annual[financialCategory].value = `max is 24`;\r\n }\r\n });\r\n\r\n monthsObjectConvertToArray.forEach((month: string) => {\r\n const convertMonthToArray = Object.keys(remainingProperty[month]);\r\n\r\n // extract financial category\r\n convertMonthToArray.forEach((financialCategory: string) => {\r\n if (values[month][financialCategory] && values[month][financialCategory].value > 24 && (financialCategory === 'billableHoursPerDay' || financialCategory === 'nonBillableHoursPerDay')) {\r\n errors[month][financialCategory].value = `max is 24`;\r\n }\r\n });\r\n });\r\n\r\n }\r\n\r\n let totalRequired = 0;\r\n const convertErrorsToArray = Object.keys(remainingProperty);\r\n\r\n // check if there is a required field left in order to call the onSubmit function\r\n if (convertErrorsToArray.length) {\r\n convertErrorsToArray.forEach((topLevelField: string) => {\r\n const tempTopLevelField = errors[topLevelField];\r\n\r\n const secondLevelFields = Object.keys(tempTopLevelField);\r\n\r\n if (secondLevelFields.length) {\r\n secondLevelFields.forEach((secondLevelField: string) => {\r\n const tempSecondLevelField = errors[topLevelField][secondLevelField].value;\r\n if (tempSecondLevelField.length > 0) {\r\n totalRequired += 1;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // indicate that all input are valid\r\n if (totalRequired === 0) {\r\n return undefined;\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onFormValueChanged = (form: FormApi, changeProps: any) => {\r\n if (!changeProps.pristine) {\r\n setIsFormChanged(true);\r\n }\r\n };\r\n\r\n const onDiscardChanges = (agree: boolean) => {\r\n if (agree) {\r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n } else {\r\n setShowDiscard(false);\r\n }\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const required = (value: any) => (value !== undefined && value !== null ? undefined : `required`);\r\n\r\n // tslint:disable-next-line: no-any\r\n // const mustBeNumber = (value: any) => (isNaN(value) ? 'Must be a number' : undefined);\r\n\r\n // // tslint:disable-next-line: no-any\r\n // const composeValidators = (...validators: any[]) => (value: any) => validators.reduce((error, validator) => error || validator(value), undefined);\r\n\r\n // tslint:disable-next-line: no-any\r\n const RadioComp = (compProps: any) => {\r\n\r\n const { input } = compProps; \r\n return (\r\n }\r\n />\r\n );\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onFinancialYear = (input: FieldInputProps, formApi: FormApi) => (selection: FinancialYearItem, name: string) => {\r\n if (selection) {\r\n\r\n setGenerateMonthLoading(true);\r\n\r\n input.onChange(selection);\r\n\r\n // starting month\r\n const startMonth = moment(selection.startDate).toDate();\r\n\r\n // last month from starting month\r\n const endMonth = moment(selection.startDate).add(11, 'month').toDate();\r\n\r\n const monthRange = moment.range(startMonth, endMonth);\r\n \r\n // console.log('tempLastMoth', startMonth, endMonth);\r\n\r\n const months = Array.from(monthRange.by('month'));\r\n\r\n fetchStaffBudgets(props.staffGuid, selection, months, formApi);\r\n }\r\n };\r\n\r\n const fetchStaffBudgets = (staffGuid: string | null, selection: FinancialYearItem, months: Moment.Moment[], formApi: FormApi) => {\r\n \r\n const staffBudgetQueryParams: StaffBudgetQueryParams = {\r\n staffGuid: staffGuid,\r\n startDate: selection.startDate,\r\n endDate: selection.endDate,\r\n financialYearStartDate: selection.startDate\r\n };\r\n\r\n retrieveStaffDailyBudgetsData(\r\n staffBudgetQueryParams,\r\n true,\r\n (data: StaffBudgetQieryData) => onDataRetrieved(data, selection, months, formApi),\r\n // tslint:disable-next-line: no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n }\r\n );\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onDataRetrieved = (data: StaffBudgetQieryData, selection: FinancialYearItem, months: Moment.Moment[], formApi: FormApi) => {\r\n\r\n const staffMonthlyBudgetData = data.staffBudget.staffMonthlyBudgets.staffMonthlyBudget ?\r\n data.staffBudget.staffMonthlyBudgets.staffMonthlyBudget : null;\r\n \r\n const staffWorkingDaysData = data.staffBudget.staffWorkingDays ? data.staffBudget.staffWorkingDays : null;\r\n\r\n let totalFeesRecorded = 0;\r\n let totalFeesBilled = 0;\r\n let totalFeesCollected = 0;\r\n \r\n let isBillableHoursSame = false;\r\n let isNonBillableHours = false;\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n\r\n // save all range base on startdate until 12 months\r\n formApi.change('dateRange', months);\r\n\r\n if (staffWorkingDaysData && Object.keys(staffWorkingDaysData).length) {\r\n formApi.change('week', {\r\n monday: staffWorkingDaysData.monday,\r\n tuesday: staffWorkingDaysData.tuesday,\r\n wednesday: staffWorkingDaysData.wednesday,\r\n thursday: staffWorkingDaysData.thursday,\r\n friday: staffWorkingDaysData.friday,\r\n saturday: staffWorkingDaysData.saturday,\r\n sunday: staffWorkingDaysData.sunday,\r\n });\r\n } \r\n\r\n const bugetPerMonth: { [key: string]: FinancialCategory } = {};\r\n\r\n if (staffMonthlyBudgetData && staffMonthlyBudgetData.length) {\r\n \r\n isBillableHoursSame = _.every(staffMonthlyBudgetData, ['billableHours', staffMonthlyBudgetData[0].billableHours]);\r\n isNonBillableHours = _.every(staffMonthlyBudgetData, ['nonBillableHours', staffMonthlyBudgetData[0].nonBillableHours]);\r\n\r\n staffMonthlyBudgetData.forEach((staffMonthlyBudget: StaffMonthlyBudget) => {\r\n\r\n const monthName = moment(staffMonthlyBudget.month, 'M').format('MMMM').toLowerCase();\r\n\r\n // console.log('monthName', monthName);\r\n\r\n bugetPerMonth[monthName] = {\r\n monthStartDate: moment(staffMonthlyBudget.monthStartDate).startOf('month').format('YYYY-MM-DD'),\r\n billableHoursPerDay: {\r\n isChanged: false,\r\n // tslint:disable-next-line: radix\r\n value: parseFloat(staffMonthlyBudget.billableHours)\r\n },\r\n nonBillableHoursPerDay: {\r\n isChanged: false,\r\n // tslint:disable-next-line: radix\r\n value: parseFloat(staffMonthlyBudget.nonBillableHours)\r\n },\r\n feesBilled: {\r\n isChanged: false,\r\n value: staffMonthlyBudget.feesBilled\r\n },\r\n feesCollected: {\r\n isChanged: false,\r\n value: staffMonthlyBudget.feesCollected\r\n },\r\n feesRecorded: {\r\n isChanged: false,\r\n value: staffMonthlyBudget.billableFees\r\n },\r\n realisation: {\r\n // tslint:disable-next-line: max-line-length\r\n value: staffMonthlyBudget.feesBilled && staffMonthlyBudget.billableFees ? (staffMonthlyBudget.feesBilled / staffMonthlyBudget.billableFees) * 100 > 0 ? (staffMonthlyBudget.feesBilled / staffMonthlyBudget.billableFees) * 100 : 0 : 0,\r\n isChanged: false\r\n },\r\n collectability: {\r\n // tslint:disable-next-line: max-line-length\r\n value: staffMonthlyBudget.feesCollected && staffMonthlyBudget.feesBilled ? (staffMonthlyBudget.feesCollected / staffMonthlyBudget.feesBilled) * 100 > 0 ? (staffMonthlyBudget.feesCollected / staffMonthlyBudget.feesBilled) * 100 : 0 : 0,\r\n isChanged: false\r\n }\r\n };\r\n \r\n totalFeesRecorded += staffMonthlyBudget.billableFees ? staffMonthlyBudget.billableFees : 0;\r\n totalFeesBilled += staffMonthlyBudget.feesBilled ? staffMonthlyBudget.feesBilled : 0;\r\n totalFeesCollected += staffMonthlyBudget.feesCollected ? staffMonthlyBudget.feesCollected : 0;\r\n \r\n });\r\n }\r\n \r\n months.forEach((month: Moment.Moment) => {\r\n\r\n const monthName = moment(month).format('MMMM').toLowerCase();\r\n\r\n const isMonthHaveBudget = Object.keys(bugetPerMonth).includes(monthName);\r\n\r\n if (isMonthHaveBudget) {\r\n formApi.change(monthName, {\r\n ...bugetPerMonth[monthName]\r\n });\r\n } else {\r\n formApi.change(monthName, {\r\n monthStartDate: moment(month).startOf('month').format('YYYY-MM-DD'),\r\n billableHoursPerDay: undefined,\r\n nonBillableHoursPerDay: undefined,\r\n feesRecorded: undefined,\r\n feesBilled: undefined,\r\n feesCollected: undefined,\r\n realisation: undefined,\r\n collectability: undefined\r\n });\r\n }\r\n\r\n });\r\n\r\n formApi.change('annual', {\r\n billableHoursPerDay: {\r\n // tslint:disable-next-line: radix max-line-length\r\n value: isBillableHoursSame && staffMonthlyBudgetData && staffMonthlyBudgetData.length === 12 ? staffMonthlyBudgetData[0].billableHours : undefined,\r\n isChanged: false\r\n },\r\n // tslint:disable-next-line: radix max-line-length\r\n nonBillableHoursPerDay: {\r\n value: isNonBillableHours && staffMonthlyBudgetData && staffMonthlyBudgetData.length === 12 ? staffMonthlyBudgetData[0].nonBillableHours : undefined,\r\n isChanged: false\r\n },\r\n feesRecorded: {\r\n value: totalFeesRecorded ? Math.round(totalFeesRecorded) : undefined,\r\n isChanged: false\r\n },\r\n feesBilled: {\r\n value: totalFeesBilled ? Math.round(totalFeesBilled) : undefined,\r\n isChanged: false\r\n },\r\n feesCollected: {\r\n value: totalFeesCollected ? Math.round(totalFeesCollected) : undefined,\r\n isChanged: false\r\n },\r\n realisation: {\r\n value: totalFeesBilled / totalFeesRecorded * 100,\r\n isChanged: false\r\n },\r\n collectability: {\r\n value: totalFeesCollected / totalFeesBilled * 100,\r\n isChanged: false\r\n }\r\n });\r\n \r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n setGenerateMonthLoading(false);\r\n };\r\n\r\n // tslint:disable-next-line: no-any max-line-length\r\n const onChangeAnnualValue = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (value: number | undefined) => {\r\n if (values.financialType === 'monthly') {\r\n return;\r\n }\r\n\r\n // code here\r\n input.onChange(value);\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n // get input name\r\n const field = input.name.split('.')[1];\r\n\r\n formApi.batch(() => {\r\n\r\n values.dateRange.forEach((tempDate: Moment.Moment) => {\r\n // code here\r\n const month = moment(tempDate).format('MMMM').toLowerCase();\r\n\r\n // copy billable hours and non billable our to monthly\r\n formApi.change(`${month}.${field}.value`, value);\r\n\r\n // assigned that field changed by user\r\n formApi.change(`${month}.${field}.isChanged`, true);\r\n });\r\n\r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onChangeMonthlyValue = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (value: number | undefined) => {\r\n\r\n if (values.financialType === 'annually') {\r\n return;\r\n }\r\n\r\n const isChangedInputFieldName = input.name.replace('value', 'isChanged');\r\n\r\n input.onChange(value);\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n\r\n formApi.change(isChangedInputFieldName, true);\r\n\r\n // topLevelField are financialType, financialYear, months, dateRange\r\n const topLevelField = input.name.split('.')[0];\r\n\r\n // financial categories and etc..\r\n const secondLevelField = input.name.split('.')[1];\r\n\r\n if (values[topLevelField] && Object.keys(values[topLevelField]).length) {\r\n // getting realisation percentegate\r\n if (secondLevelField === 'feesRecorded' && value && values[topLevelField].feesBilled) {\r\n const realisation = values[topLevelField].feesBilled.value / value;\r\n const realisationPercentage = realisation * 100;\r\n formApi.change(`${topLevelField}.realisation.value`, realisationPercentage);\r\n // formApi.change('annual.feesRecorded', 500);\r\n }\r\n\r\n // getting realisation percentegate\r\n if (secondLevelField === 'feesBilled' && value && values[topLevelField].feesRecorded) {\r\n const realisation = value / values[topLevelField].feesRecorded.value;\r\n const realisationPercentage = realisation * 100;\r\n formApi.change(`${topLevelField}.realisation.value`, realisationPercentage);\r\n }\r\n\r\n // getting collectability percentegate\r\n if (secondLevelField === 'feesBilled' && value && values[topLevelField].feesCollected) {\r\n const collectability = values[topLevelField].feesCollected.value / value;\r\n const collectabilityPercentage = collectability * 100;\r\n formApi.change(`${topLevelField}.collectability.value`, collectabilityPercentage);\r\n }\r\n\r\n // getting collectability percentegate\r\n if (secondLevelField === 'feesCollected' && value && values[topLevelField].feesBilled) {\r\n const collectability = value / values[topLevelField].feesBilled.value;\r\n const collectabilityPercentage = collectability * 100;\r\n formApi.change(`${topLevelField}.collectability.value`, collectabilityPercentage);\r\n }\r\n\r\n if (secondLevelField === 'feesRecorded' || secondLevelField === 'feesBilled' || secondLevelField === 'feesCollected') {\r\n\r\n // object that need to remove just toget only the object for months\r\n const defaultExclude = ['financialType', 'financialYear', 'week', 'annual', 'dateRange'];\r\n\r\n // removed unuse property\r\n const excludedProperty = _.omit(values, [...defaultExclude, topLevelField]);\r\n\r\n // convert object values to array\r\n const arrayOfValues = Object.values(excludedProperty);\r\n\r\n let totalFeesRecorded = 0;\r\n let totalFeesBilled = 0;\r\n let totalFeesCollected = 0;\r\n\r\n // console.log('arrayOfValues', arrayOfValues);\r\n\r\n arrayOfValues.forEach((finacialCategory: FinancialCategory) => {\r\n const selectedField = _.pick(finacialCategory, secondLevelField);\r\n totalFeesRecorded += selectedField.feesRecorded && selectedField.feesRecorded.value ? selectedField.feesRecorded.value : 0;\r\n totalFeesBilled += selectedField.feesBilled && selectedField.feesBilled.value ? selectedField.feesBilled.value : 0;\r\n totalFeesCollected += selectedField.feesCollected && selectedField.feesCollected.value ? selectedField.feesCollected.value : 0;\r\n });\r\n\r\n if (secondLevelField === 'feesRecorded') {\r\n totalFeesRecorded += value ? value : 0;\r\n formApi.change('annual.feesRecorded.value', totalFeesRecorded);\r\n }\r\n if (secondLevelField === 'feesBilled') { \r\n totalFeesBilled += value ? value : 0;\r\n formApi.change('annual.feesBilled.value', totalFeesBilled);\r\n }\r\n if (secondLevelField === 'feesCollected') {\r\n totalFeesCollected += value ? value : 0;\r\n formApi.change('annual.feesCollected.value', totalFeesCollected);\r\n }\r\n // console.log('excludedProperty', excludedProperty);\r\n\r\n }\r\n\r\n // calculate annual for billable hours per day and non billable hours per day\r\n if (secondLevelField === 'billableHoursPerDay' || secondLevelField === 'nonBillableHoursPerDay') {\r\n\r\n // object that need to remove just toget only the object for months\r\n const defaultExclude = ['financialType', 'financialYear', 'week', 'annual', 'dateRange'];\r\n\r\n // removed unuse property\r\n const excludedProperty = _.omit(values, [...defaultExclude, topLevelField]);\r\n\r\n // convert object values to array\r\n const arrayOfValues = Object.values(excludedProperty);\r\n\r\n // check if all value in array by financial category is the same or not\r\n const isSame = _.every(arrayOfValues, [secondLevelField, value]);\r\n\r\n // assigned value ethier blank or the same value from months\r\n formApi.change(`annual.${secondLevelField}`, isSame ? value : undefined);\r\n\r\n }\r\n }\r\n \r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n };\r\n\r\n // tslint:disable-next-line: no-any max-line-length\r\n const onChangeAnnualFeesCollected = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (value: number | null) => {\r\n if (values.financialType === 'monthly') {\r\n return;\r\n }\r\n\r\n // code here\r\n input.onChange(value);\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n\r\n if (values.annual && Object.keys(values.annual).length) {\r\n let tempCollectabilityPercentage: number | undefined = undefined;\r\n let monthlyCollectabilityPercentage: number | undefined = undefined;\r\n\r\n const feesCollectedByMonth = value ? value / 12 : undefined;\r\n\r\n if (value && values.annual.feesBilled ) {\r\n tempCollectabilityPercentage = (value / values.annual.feesBilled.value) * 100;\r\n monthlyCollectabilityPercentage = ( (value / 12) / (values.annual.feesBilled.value / 12)) * 100;\r\n }\r\n\r\n formApi.change('annual.collectability', tempCollectabilityPercentage);\r\n\r\n values.dateRange.forEach((tempDate: Moment.Moment) => {\r\n\r\n // get the name of the month\r\n const month = moment(tempDate).format('MMMM').toLowerCase();\r\n\r\n formApi.change(`${month}.feesCollected.value`, feesCollectedByMonth);\r\n formApi.change(`${month}.feesCollected.isChanged`, true);\r\n formApi.change(`${month}.collectability.value`, monthlyCollectabilityPercentage);\r\n\r\n });\r\n }\r\n\r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n };\r\n\r\n // tslint:disable-next-line: no-any max-line-length\r\n const onChangeAnnualFeesBilled = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (value: number | null) => {\r\n if (values.financialType === 'monthly') {\r\n return;\r\n }\r\n\r\n // code here\r\n input.onChange(value);\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n\r\n if (values.annual && Object.keys(values.annual).length) {\r\n let tempCollectabilityPercentage: number | undefined = undefined;\r\n let monthlyCollectabilityPercentage: number | undefined = undefined;\r\n\r\n let tempRealisationPercentage: number | undefined = undefined;\r\n let monthlyRealisationPercentage: number | undefined = undefined;\r\n\r\n const feesBilledByMonth = value ? value / 12 : undefined;\r\n\r\n if (value && values.annual.feesCollected ) {\r\n tempCollectabilityPercentage = (values.annual.feesCollected.value / value) * 100;\r\n monthlyCollectabilityPercentage = ((values.annual.feesCollected.value / 12) / (value / 12)) * 100;\r\n }\r\n\r\n if (value && values.annual.feesRecorded ) {\r\n tempRealisationPercentage = (value / values.annual.feesRecorded.value) * 100;\r\n monthlyRealisationPercentage = ((value / 12) / (values.annual.feesRecorded.value / 12)) * 100;\r\n }\r\n\r\n formApi.change('annual.collectability.value', tempCollectabilityPercentage);\r\n formApi.change('annual.realisation.value', tempRealisationPercentage);\r\n\r\n values.dateRange.forEach((tempDate: Moment.Moment) => {\r\n\r\n // get the name of the month\r\n const month = moment(tempDate).format('MMMM').toLowerCase();\r\n\r\n formApi.change(`${month}.feesBilled.value`, feesBilledByMonth);\r\n formApi.change(`${month}.feesBilled.isChanged`, true);\r\n formApi.change(`${month}.collectability.value`, monthlyCollectabilityPercentage);\r\n formApi.change(`${month}.realisation.value`, monthlyRealisationPercentage);\r\n\r\n });\r\n }\r\n\r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n };\r\n\r\n // tslint:disable-next-line: no-any max-line-length\r\n const onChangeAnnualFeesRecorded = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (value: number | null) => {\r\n if (values.financialType === 'monthly') {\r\n return;\r\n }\r\n\r\n input.onChange(value);\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n\r\n if (values.annual && Object.keys(values.annual).length) {\r\n let tempRealisationPercentage: number | undefined = undefined;\r\n let monthlyRealisationPercentage: number | undefined = undefined;\r\n\r\n const feesRecordedByMonth = value ? value / 12 : undefined;\r\n\r\n if (value && values.annual.feesBilled ) {\r\n tempRealisationPercentage = (values.annual.feesBilled.value / value) * 100;\r\n monthlyRealisationPercentage = ((values.annual.feesBilled.value / 12) / (value / 12)) * 100;\r\n }\r\n\r\n formApi.change('annual.realisation.value', tempRealisationPercentage);\r\n\r\n values.dateRange.forEach((tempDate: Moment.Moment) => {\r\n\r\n // get the name of the month\r\n const month = moment(tempDate).format('MMMM').toLowerCase();\r\n\r\n formApi.change(`${month}.feesRecorded.value`, feesRecordedByMonth);\r\n formApi.change(`${month}.feesRecorded.isChanged`, true);\r\n formApi.change(`${month}.realisation.value`, monthlyRealisationPercentage);\r\n\r\n });\r\n }\r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onGetPercentage = (value: any, suffix?: string) => {\r\n if (Object.keys(value).length && value && value.hasOwnProperty('realisation') && value.realisation && value.realisation.value && suffix?.toLocaleLowerCase() === 'realisation') {\r\n return `${formatNumber(value.realisation.value)}% ${suffix}`;\r\n }\r\n if (Object.keys(value).length && value && value.hasOwnProperty('collectability') && value.collectability && value.collectability.value && suffix?.toLocaleLowerCase() === 'collectability') {\r\n return `${formatNumber(value.collectability.value)}% ${suffix}`;\r\n }\r\n return '';\r\n };\r\n\r\n // tslint:disable-next-line: max-line-length no-any\r\n const onCheckboxChange = (input: FieldInputProps, formApi: FormApi, values: StaffNameBudgetDialogForm) => (event: React.ChangeEvent, checked: boolean) => {\r\n\r\n input.onChange(checked);\r\n\r\n const defaultExclude = ['financialType', 'financialYear', 'week', 'dateRange'];\r\n\r\n // removed unuse property\r\n const excludedProperty = _.omit(values, [...defaultExclude]);\r\n\r\n const monthAndAnnualKeys = Object.keys(excludedProperty);\r\n \r\n formApi.setConfig('keepDirtyOnReinitialize', false);\r\n\r\n formApi.batch(() => {\r\n \r\n monthAndAnnualKeys.forEach((monthAndAnnual: string) => {\r\n const financialCategoryKeys = Object.keys(values[monthAndAnnual]);\r\n\r\n financialCategoryKeys.forEach((financialCategory: string) => {\r\n const field = values[monthAndAnnual][financialCategory];\r\n // check if field has value then apply the ischange to true\r\n if (field && Object.keys(field).length && field.hasOwnProperty('value') && (field.value !== null || field.value !== undefined)) {\r\n formApi.change(`${monthAndAnnual}.${financialCategory}.isChanged`, true);\r\n }\r\n });\r\n // if (values[finacialCategory].value !== undefined || values[finacialCategory].value !== null)\r\n });\r\n });\r\n\r\n formApi.setConfig('keepDirtyOnReinitialize', true);\r\n\r\n };\r\n\r\n const actionButton = (\r\n // tslint:disable-next-line: no-any\r\n form: FormApi,\r\n submitting: boolean,\r\n pristine: boolean,\r\n // tslint:disable-next-line: no-any\r\n values: AnyObject\r\n ) => {\r\n return (\r\n
\r\n {/* */}\r\n
\r\n {\r\n // code here..\r\n }}\r\n disabled={submitting || pristine || props.enableBudgetSync}\r\n >\r\n Save\r\n \r\n
\r\n
\r\n \r\n Reset\r\n \r\n \r\n Cancel\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const financialCategoryComponent = (formApi: FormApi) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {({ input, meta }) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* Enter */}\r\n \r\n \r\n }\r\n value=\"annually\"\r\n label=\"Annually\" \r\n />\r\n \r\n }\r\n value=\"monthly\"\r\n label=\"Monthly\" \r\n />\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const weekdaysComponent = (formApi: FormApi, values: StaffNameBudgetDialogForm) => {\r\n return (\r\n
\r\n Working Days\r\n \r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Sun\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Mon\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Tue\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Wed\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Thu\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Fri\"\r\n />\r\n )}\r\n \r\n \r\n {({ input, meta }) => (\r\n input.onChange(event.target.checked)}\r\n checked={input.value}\r\n onChange={onCheckboxChange(input, formApi, values)}\r\n />\r\n }\r\n labelPlacement=\"bottom\"\r\n label=\"Sat\"\r\n />\r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n const annualComponent = (disabled: boolean, form: FormApi, values: StaffNameBudgetDialogForm) => {\r\n return (\r\n \r\n \r\n Annual Amount\r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n {/* \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n */}\r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n {/* \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n */}\r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const monthlyComponent = (disabled: boolean, form: FormApi, values: StaffNameBudgetDialogForm) => {\r\n return (\r\n <>\r\n {values.dateRange.map((tempDate: Moment.Moment) => {\r\n\r\n const month = moment(tempDate).format('MMMM').toLowerCase();\r\n\r\n return (\r\n \r\n \r\n \r\n {month}\r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n {/* \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n */}\r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n {/* \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n */}\r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {(fieldProps) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n {onSubmitLoading && (\r\n setOnSubmitLoading(false)}\r\n />\r\n )}\r\n\r\n \r\n {props.staffName}\r\n true}\r\n keepDirtyOnReinitialize={true}\r\n validate={onValidate}\r\n // debug={(values) => {\r\n // // tslint:disable-next-line: no-console\r\n // console.log('Debug Values', values);\r\n // }}\r\n render={({handleSubmit, form, submitting, pristine, values}) => (\r\n
\r\n\r\n {\r\n onFormValueChanged(form, props);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n {financialCategoryComponent(form)}\r\n \r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }: { values: StaffNameBudgetDialogForm }) => (\r\n \r\n {weekdaysComponent(form, values)}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }: { values: StaffNameBudgetDialogForm }) => (\r\n \r\n {generateMonthLoading ? (\r\n \r\n \r\n
\r\n \r\n Retrieving budgets...\r\n
\r\n
\r\n
\r\n ) : (\r\n <>\r\n \r\n \r\n {annualComponent(values.financialType === 'monthly', form, values)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Fees Recorded\r\n Fees Billed\r\n Fees Collected\r\n \r\n Billable hours per day\r\n \r\n \r\n Non Billable hours per day\r\n \r\n \r\n \r\n {monthlyComponent(values.financialType === 'annually', form, values)}\r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n {/* {printJson(values)} */}\r\n
\r\n \r\n {actionButton(form, submitting, pristine, values)}\r\n \r\n \r\n )} \r\n />\r\n
\r\n );\r\n};\r\n\r\n// tslint:disable-next-line: no-any\r\nexport function printJson(values: any) {\r\n if (values) {\r\n return (\r\n <>\r\n
\r\n                    {JSON.stringify(values, undefined, 2)}\r\n                
\r\n \r\n );\r\n } else {\r\n return (\r\n <>\r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }) => (\r\n
\r\n                            {JSON.stringify(values, undefined, 2)}\r\n                            {/*  */}\r\n                        
\r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport interface StaffMonthlyBudgetInputParams {\r\n staffGuid: string | null;\r\n staffMonthlyBudgetInput: {\r\n staffMonthlyBudgetsInput: StaffMonthlyBudgetsInput[];\r\n };\r\n staffWorkingDaysInput: StaffWorkingDaysInput;\r\n}\r\n\r\nexport interface StaffMonthlyBudgetsInput {\r\n monthStartDate?: string;\r\n chargeableHours?: number;\r\n nonChargeableHours?: number;\r\n feesRecorded?: number;\r\n feesBilled?: number;\r\n feesCollected?: number;\r\n}\r\n\r\nexport interface StaffWorkingDaysInput {\r\n financialYearStartDate: string | null;\r\n sunday: boolean | null;\r\n monday: boolean | null;\r\n tuesday: boolean | null;\r\n wednesday: boolean | null;\r\n thursday: boolean | null;\r\n friday: boolean | null;\r\n saturday: boolean | null;\r\n}\r\n\r\nexport const UPDATE_STAFF_MONTHLY_BUDGET_MUTATION = gql`\r\n mutation UpdateStaffMonthlyBudget(\r\n $staffGuid: String,\r\n $staffWorkingDaysInput: StaffWorkingDaysInput\r\n $staffMonthlyBudgetInput : UpdateStaffMonthlyBudgetInput,\r\n ) {\r\n updateStaffMonthlyBudget( \r\n staffGuid: $staffGuid,\r\n staffWorkingDaysInput: $staffWorkingDaysInput,\r\n staffMonthlyBudgetInput: $staffMonthlyBudgetInput\r\n )\r\n }\r\n`;\r\n\r\nexport function retrieveStaffDailyBudgetsData(\r\n query: StaffBudgetQueryParams,\r\n refresh: Boolean,\r\n onSuccess: (data: StaffBudgetQieryData) => void,\r\n // tslint:disable-next-line:no-any\r\n onError: (reason: any) => void\r\n) {\r\n var fetchPolicy: FetchPolicy = refresh === true ? 'network-only' : 'cache-first';\r\n client.query({\r\n query: STAFF_MONTHLY_BUDGETS_QUERY,\r\n variables: {\r\n staffGuid: query.staffGuid,\r\n startDate: query.startDate,\r\n endDate: query.endDate,\r\n financialYearStartDate: query.financialYearStartDate\r\n },\r\n fetchPolicy: fetchPolicy\r\n })\r\n // tslint:disable-next-line:no-any\r\n .then((results: { data: any; }) => {\r\n onSuccess(results.data);\r\n })\r\n // tslint:disable-next-line:no-any\r\n .catch((reason: any ) => { onError(reason); \r\n });\r\n}\r\n\r\ninterface StaffBudgetQueryParams {\r\n staffGuid: string | null;\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n financialYearStartDate: Date | null;\r\n}\r\nexport interface StaffBudgetQieryData {\r\n staffBudget: StaffBudget;\r\n}\r\n\r\nexport interface StaffBudget {\r\n staffMonthlyBudgets: StaffMonthlyBudgets;\r\n staffWorkingDays: StaffWorkingDays;\r\n}\r\n\r\nexport interface StaffMonthlyBudgets {\r\n recordCount: number;\r\n staffMonthlyBudget: StaffMonthlyBudget[];\r\n}\r\n\r\nexport interface StaffMonthlyBudget {\r\n id: number;\r\n staffId: number;\r\n staffGuid: string;\r\n monthStartDate: Date;\r\n month: number;\r\n billableHours: string;\r\n nonBillableHours: string;\r\n feesBilled: number;\r\n feesCollected: number;\r\n billableFees: number;\r\n}\r\n\r\nexport interface StaffWorkingDays {\r\n id: number;\r\n staffGuid: string;\r\n financialYearStartDate: Date;\r\n monday: boolean;\r\n tuesday: boolean;\r\n wednesday: boolean;\r\n thursday: boolean;\r\n friday: boolean;\r\n saturday: boolean;\r\n sunday: boolean;\r\n}\r\n\r\nexport const STAFF_MONTHLY_BUDGETS_QUERY = gql`\r\n query staffMonthlyBudgets($staffGuid: String, $startDate: DateTime, $endDate: DateTime, $financialYearStartDate: DateTime) {\r\n staffBudget{\r\n staffMonthlyBudgets(staffGuid: $staffGuid, startDate: $startDate, endDate: $endDate){\r\n recordCount,\r\n \t\tstaffMonthlyBudget{\r\n id,\r\n staffId,\r\n staffGuid,\r\n monthStartDate,\r\n month,\r\n billableHours,\r\n nonBillableHours,\r\n feesBilled,\r\n feesCollected,\r\n billableFees\r\n } \r\n }\r\n \tstaffWorkingDays(staffGuid: $staffGuid, financialYearStartDate: $financialYearStartDate) {\r\n id,\r\n staffGuid\r\n financialYearStartDate,\r\n monday,\r\n tuesday,\r\n wednesday,\r\n thursday,\r\n friday,\r\n saturday,\r\n sunday\r\n }\r\n }\r\n }\r\n`;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport FullCalendar, { CalendarApi, DatesSetArg } from '@fullcalendar/react';\r\nimport { createStyles, IconButton, makeStyles, Modal, Paper, Theme, Tooltip, withStyles } from '@material-ui/core';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport dayGridPlugin from '@fullcalendar/daygrid';\r\nimport timeGridPlugin from '@fullcalendar/timegrid';\r\nimport interactionPlugin, { DateClickArg } from '@fullcalendar/interaction'; // needed for dayClick\r\nimport { CurrencySymbol, CurrencySymbolData, retrieveStaffDailyBudgetsData, StaffDailyBudget,\r\n StaffDailyBudgetsData, StaffDailyBudgetsParams } from '../StaffSummaryRepository';\r\nimport { showNotification } from '../../App';\r\nimport { useQuery } from 'react-apollo';\r\nimport CancelIcon from '@material-ui/icons/Cancel';\r\nimport Moment from 'moment';\r\nimport { extendMoment } from 'moment-range';\r\nimport { RvLoader } from '../../components/Loader';\r\nimport { UserFeature, UserFeatureEnum } from '../../types/UserFeature';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\n// import DeleteIcon from '@material-ui/icons/Delete';\r\nimport { StaffBudgetForm, StaffBudgetMaintenanceDailog } from '../dialog/StaffBudgetMaintenanceDailog';\r\nimport { client } from '../..';\r\nimport gql from 'graphql-tag';\r\nimport { HasBudgetEditPermission } from '../StaffSummaryColumns';\r\nimport { formatNumber } from '../../helpers/ChartHelper';\r\nimport DateRangeIcon from '@material-ui/icons/DateRange';\r\nimport ViewWeekIcon from '@material-ui/icons/ViewWeek';\r\nimport EventIcon from '@material-ui/icons/Event';\r\nimport TodayIcon from '@material-ui/icons/Today';\r\nimport { ToggleButton, ToggleButtonGroup } from '@material-ui/lab';\r\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\nimport { StaffNameBudgetDialog } from './StaffNameBudgetDialog';\r\nimport ReorderIcon from '@material-ui/icons/Reorder';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n maxWidth: '1400px',\r\n margin: '0 auto',\r\n position: 'absolute',\r\n top: '7%',\r\n left: '10px',\r\n bottom: '10px',\r\n right: '10px',\r\n display: 'flex',\r\n // width: '100%',\r\n // transform: 'translate(-50%, -50%)',\r\n padding: 15,\r\n flexFlow: 'column',\r\n flex: 1,\r\n },\r\n modalWrapper: {\r\n\r\n },\r\n calendarWrapper: {\r\n flex: 1,\r\n display: 'flex',\r\n position: 'relative',\r\n },\r\n closeButton: {\r\n position: 'absolute',\r\n top: '-111px',\r\n right: '-60px',\r\n zIndex: 999,\r\n backgroundColor: '#fff',\r\n '&:hover': {\r\n backgroundColor: '#000',\r\n color: '#fff'\r\n }\r\n },\r\n eventContentContainer: {\r\n padding: 1,\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flex: 1,\r\n height: '100%',\r\n width: '100%',\r\n '& .event-content': {\r\n display: 'flex',\r\n flexFlow: 'row wrap',\r\n justifyContent: 'space-between',\r\n '& .label': {\r\n marginRight: 5,\r\n }\r\n }\r\n },\r\n calendarContainer: {\r\n display: 'flex',\r\n flex: 1,\r\n '& .fc-daygrid-day': {\r\n height: 143.031,\r\n width: 151.562,\r\n },\r\n '& .fc-scroller-liquid-absolute': {\r\n overflow: 'auto !important',\r\n },\r\n '& > div.fc-theme-standard': {\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flex: 1,\r\n '& > div.fc-view-harness': {\r\n height: 'auto !important'\r\n }\r\n },\r\n '& .fc-button-primary': {\r\n backgroundColor: '#5173FF !important',\r\n borderColor: '#5173FF !important',\r\n boxShadow: 'none !important',\r\n },\r\n '& .fc-button-primary:hover': {\r\n backgroundColor: 'green !important',\r\n borderColor: 'green !important',\r\n },\r\n '& .fc-button-active': {\r\n backgroundColor: 'green !important',\r\n borderColor: 'green !important',\r\n },\r\n '& .fc-header-toolbar': {\r\n margin: '0 !important'\r\n }\r\n },\r\n weeklyTotalContainer: {\r\n paddingLeft: 15,\r\n // paddingTop: 10,\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flexShrink: 1,\r\n // marginTop: '46px',\r\n minWidth: '300px',\r\n '& .weekly-title': {\r\n textAlign: 'center',\r\n fontSize: '14px',\r\n fontWeight: 700,\r\n margin: 0,\r\n padding: '2px 4px',\r\n borderTop: '1px solid var(--fc-border-color, #ddd)',\r\n borderLeft: '1px solid var(--fc-border-color, #ddd)',\r\n borderRight: '1px solid var(--fc-border-color, #ddd)',\r\n },\r\n },\r\n weeklyTotalContentWrapper: {\r\n flex: 1,\r\n display: 'flex',\r\n flexFlow: 'column',\r\n position: 'relative'\r\n },\r\n weeklyTotalContentContainer: {\r\n position: 'absolute',\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n overflow: 'auto',\r\n },\r\n weekLists: {\r\n listStyleType: 'none',\r\n padding: 0,\r\n border: '1px solid var(--fc-border-color, #ddd)',\r\n flex: 1,\r\n flexFlow: 'column',\r\n display: 'flex',\r\n overflow: 'auto',\r\n margin: 0,\r\n '& .week-list': {\r\n padding: '0px 10px 10px 10px',\r\n borderBottom: '1px solid var(--fc-border-color, #ddd)',\r\n margin: 0,\r\n display: 'flex',\r\n flexFlow: 'column',\r\n flex: 1,\r\n minHeight: 143.031,\r\n },\r\n '& .week-title': {\r\n // textAlign: 'center',\r\n // borderBottom: '1px solid var(--fc-border-color, #ddd)',\r\n margin: '0 -10px',\r\n padding: '10px',\r\n fontWeight: 600,\r\n color: '#5173FF',\r\n },\r\n '& .month-total': {\r\n backgroundColor: 'var(--fc-event-bg-color, #5173FF)',\r\n color: '#fff',\r\n },\r\n '& .week-content': {\r\n paddingTop: 1,\r\n // paddingBottom: 20,\r\n }\r\n },\r\n totalMonth: {\r\n marginTop: 10\r\n },\r\n loaderWrapper: {\r\n display: 'flex',\r\n flex: 1,\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n modalHeader: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n paddingBottom: 10,\r\n color: '#5173FF',\r\n '& > div': {\r\n fontSize: 21,\r\n display: 'flex',\r\n alignItems: 'center',\r\n }\r\n },\r\n iconButton: {\r\n color: '#5173FF',\r\n },\r\n toggleButtonGroup: {\r\n '& button.Mui-selected': {\r\n color: '#5173FF'\r\n }\r\n },\r\n calendarControl: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: 1,\r\n },\r\n dateControl: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n maxWidth: 350,\r\n flex: 1,\r\n '& .title': {\r\n fontSize: '18px',\r\n textAlign: 'center',\r\n fontWeight: 600,\r\n }\r\n },\r\n labelWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n '&.label-1': {\r\n marginRigt: '5px'\r\n }\r\n }\r\n })\r\n);\r\n\r\nconst LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: theme.palette.common.white,\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: 11,\r\n },\r\n}))(Tooltip);\r\n\r\nenum CalendarView {\r\n DAY_VIEW = 0,\r\n WEEK_VIEW,\r\n MONTH_VIEW\r\n}\r\n\r\ninterface WeeklyProps {\r\n weekNumber: number;\r\n startDate: Date;\r\n endDate: Date;\r\n billableHours: number;\r\n nonBillableHours: number;\r\n feesBilled: number;\r\n feesCollected: number;\r\n billableFees: number;\r\n}\r\ninterface StaffBudgetMaintenanceModalProps {\r\n open: boolean;\r\n onClose?: () => void;\r\n // tslint:disable-next-line: no-any\r\n data?: any;\r\n}\r\n\r\ninterface StaffBudgetMaintenanceModalState {\r\n // tslint:disable-next-line: no-any\r\n events: any;\r\n weekly: WeeklyProps[];\r\n isLoading: boolean;\r\n \r\n startDate: Date;\r\n endDate: Date;\r\n\r\n totalBillableHours: number;\r\n totalNonBillableHours: number;\r\n totalFeesBilled: number;\r\n totalFeesCollected: number;\r\n totalBillableFees: number;\r\n\r\n isEditOpen: boolean;\r\n\r\n isDateRangeDisabled: boolean;\r\n\r\n formData: StaffBudgetForm;\r\n\r\n calendarStart: Date;\r\n calendarEnd: Date;\r\n\r\n staffFinancialYearBudget: {\r\n budgetDate?: Date;\r\n billableHours: number;\r\n nonBillableHours: number;\r\n feesBilled: number;\r\n feesCollected: number;\r\n billableFees: number;\r\n financialPeriodStartDate?: Date;\r\n financialPeriodEndDate?: Date;\r\n } | null;\r\n\r\n viewType: CalendarView;\r\n\r\n isAddStaffBudgets: boolean;\r\n}\r\n\r\nexport const StaffBudgetMaintenanceModal: React.FC = ( props ) => {\r\n\r\n const staffName = props.data.name;\r\n const staffGuid = props.data.staffGuid;\r\n\r\n const calendarRef = useRef(null);\r\n\r\n const [monethlyBudgetSubscriptionTriggered, setMonethlyBudgetSubscriptionTriggered] = useState(false);\r\n\r\n const moment = extendMoment(Moment);\r\n\r\n const classes = useStyles();\r\n\r\n const [enableBudgetSync, setEnableBudgetSync] = useState(false);\r\n\r\n const staffBudgetSettingQuery = useQuery(STAFF_BUDGET_SETTINGS_QUERY, {\r\n fetchPolicy: 'network-only',\r\n notifyOnNetworkStatusChange: true\r\n });\r\n\r\n // enable budget button when the value is true\r\n // tslint:disable-next-line: max-line-length\r\n\r\n const currencySymbol = useQuery(CurrencySymbol);\r\n\r\n const [state, setState] = useState({\r\n events: [],\r\n weekly: [],\r\n isLoading: true,\r\n totalBillableHours: 0,\r\n totalNonBillableHours: 0,\r\n totalFeesBilled: 0,\r\n totalFeesCollected: 0,\r\n totalBillableFees: 0,\r\n startDate: new Date(),\r\n endDate: new Date(),\r\n isEditOpen: false,\r\n isDateRangeDisabled: false,\r\n calendarStart: moment().startOf('month').toDate(),\r\n calendarEnd: moment().endOf('month').toDate(),\r\n formData: {\r\n startDate: null,\r\n endDate: null,\r\n billableAmountPerDay: 0,\r\n billableHoursPerDay: 0,\r\n nonBillableHoursPerDay: 0,\r\n feesBilledPerDay: 0,\r\n feesCollectedPerDay: 0,\r\n // estimatedBudget: 0,\r\n },\r\n staffFinancialYearBudget: {\r\n billableHours: 0,\r\n nonBillableHours: 0,\r\n feesBilled: 0,\r\n feesCollected: 0,\r\n billableFees: 0,\r\n },\r\n viewType: CalendarView.MONTH_VIEW,\r\n isAddStaffBudgets: false\r\n });\r\n\r\n useEffect(() => {\r\n if (!staffBudgetSettingQuery.loading && !staffBudgetSettingQuery.error && staffBudgetSettingQuery.data) {\r\n const isEnableBudgetSync = staffBudgetSettingQuery.data.settings.applications.staffBudgetSettings.config.enableBudgetSync;\r\n // tslint:disable-next-line: no-console\r\n // console.log('isEnableBudgetSync', isEnableBudgetSync);\r\n setEnableBudgetSync(isEnableBudgetSync);\r\n }\r\n // tslint:disable-next-line: align\r\n }, [staffBudgetSettingQuery.loading, staffBudgetSettingQuery.error, staffBudgetSettingQuery.data]);\r\n\r\n useEffect(() => {\r\n if (props.open) {\r\n staffBudgetSettingQuery.refetch();\r\n }\r\n // tslint:disable-next-line: align\r\n }, [props.open]);\r\n\r\n useEffect(() => {\r\n \r\n const staffDailyBudgetNotificationObj = staffDailyBudgetNotification();\r\n const staffMonthlyBudgetNotificationObj = staffMonthlyBudgetNotification();\r\n\r\n return () => {\r\n staffDailyBudgetNotificationObj.unsubscribe();\r\n staffMonthlyBudgetNotificationObj.unsubscribe();\r\n };\r\n // tslint:disable-next-line: align\r\n }, []);\r\n\r\n const staffMonthlyBudgetNotification = () => {\r\n return (\r\n // let subscription =\r\n client\r\n .subscribe({\r\n fetchPolicy: 'no-cache',\r\n query: UPDATE_STAFF_MONTHLY_BUDGET_SUBSCRIPTION,\r\n variables: {},\r\n })\r\n .subscribe({\r\n // tslint:disable-next-line:no-any\r\n next(results: any) {\r\n if (results.data.updateStaffMonthlyBudgetNotification.status) {\r\n\r\n const { updateStaffMonthlyBudgetNotification } = results.data;\r\n\r\n showNotification('Success', updateStaffMonthlyBudgetNotification.message, 'info');\r\n\r\n setMonethlyBudgetSubscriptionTriggered(true);\r\n\r\n if (updateStaffMonthlyBudgetNotification.message.includes('Updated Successfully')) {\r\n\r\n const staffDailyBudgetsParams: StaffDailyBudgetsParams = {\r\n staffGuid: staffGuid,\r\n startDate: state.calendarStart,\r\n endDate: state.calendarEnd,\r\n };\r\n \r\n retrieveStaffDailyBudgetsData(\r\n staffDailyBudgetsParams,\r\n true,\r\n (data: StaffDailyBudgetsData) => ononDataRetrieved(data, state.calendarStart, state.calendarEnd),\r\n // tslint:disable-next-line: no-any\r\n function (reason: any): void {\r\n setMonethlyBudgetSubscriptionTriggered(false);\r\n showNotification(null, reason, 'error');\r\n }\r\n );\r\n }\r\n\r\n } else {\r\n setMonethlyBudgetSubscriptionTriggered(false);\r\n showNotification('Failed', results.data.updateStaffMonthlyBudgetNotification.message, 'error');\r\n }\r\n },\r\n // tslint:disable-next-line:no-any\r\n error(err: any) {\r\n // tslint:disable-next-line:no-console\r\n console.error(err);\r\n setMonethlyBudgetSubscriptionTriggered(false);\r\n showNotification(null, err, 'error');\r\n },\r\n })\r\n );\r\n };\r\n\r\n const staffDailyBudgetNotification = () => {\r\n return (\r\n // let subscription =\r\n client\r\n .subscribe({\r\n fetchPolicy: 'no-cache',\r\n query: StaffDailyBudgetNotificationSubscription,\r\n variables: {},\r\n })\r\n .subscribe({\r\n // tslint:disable-next-line:no-any\r\n next(results: any) {\r\n if (results.data.updateStaffDailyBudgetNotification.status) {\r\n\r\n const { updateStaffDailyBudgetNotification } = results.data;\r\n\r\n showNotification('Success', updateStaffDailyBudgetNotification.message, 'info');\r\n\r\n if (updateStaffDailyBudgetNotification.message.includes('Updated Successfully')) {\r\n\r\n const staffDailyBudgetsParams: StaffDailyBudgetsParams = {\r\n staffGuid: staffGuid,\r\n startDate: state.calendarStart,\r\n endDate: state.calendarEnd,\r\n };\r\n \r\n retrieveStaffDailyBudgetsData(\r\n staffDailyBudgetsParams,\r\n true,\r\n (data: StaffDailyBudgetsData) => ononDataRetrieved(data, state.calendarStart, state.calendarEnd),\r\n // tslint:disable-next-line: no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n }\r\n );\r\n }\r\n\r\n } else {\r\n showNotification('Failed', results.data.updateStaffDailyBudgetNotification.message, 'error');\r\n }\r\n },\r\n // tslint:disable-next-line:no-any\r\n error(err: any) {\r\n // tslint:disable-next-line:no-console\r\n console.error(err);\r\n showNotification(null, err, 'error');\r\n },\r\n })\r\n );\r\n };\r\n\r\n const onDatesSet = (arg: DatesSetArg) => {\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n calendarStart: arg.start,\r\n calendarEnd: moment(arg.end).subtract(1, 'd').toDate()\r\n };\r\n });\r\n\r\n const staffDailyBudgetsParams: StaffDailyBudgetsParams = {\r\n staffGuid: staffGuid,\r\n startDate: arg.start,\r\n endDate: moment(arg.end).subtract(1, 'd').toDate()\r\n };\r\n\r\n retrieveStaffDailyBudgetsData(\r\n staffDailyBudgetsParams,\r\n true,\r\n (data: StaffDailyBudgetsData) => ononDataRetrieved(data, arg.start, arg.end),\r\n // tslint:disable-next-line: no-any\r\n function (reason: any): void {\r\n showNotification(null, reason, 'error');\r\n }\r\n );\r\n\r\n };\r\n\r\n const ononDataRetrieved = (data: StaffDailyBudgetsData, sDate: Date, eDate: Date) => {\r\n \r\n const monthRange = moment.range(sDate, moment(eDate).subtract(1, 'd').toDate());\r\n\r\n // tslint:disable-next-line: no-any\r\n const weeks: any = [];\r\n const days = Array.from(monthRange.by('day'));\r\n\r\n days.forEach(it => {\r\n if (!weeks.includes(it.week())) {\r\n weeks.push(it.week());\r\n }\r\n });\r\n\r\n const staffFinancialYearBudgetData = data.staffBudget.staffDailyBudgets.staffFinancialYearBudget ?\r\n data.staffBudget.staffDailyBudgets.staffFinancialYearBudget : null;\r\n\r\n const staffDailyBudgetData = data.staffBudget.staffDailyBudgets.staffDailyBudget.map((budget: StaffDailyBudget) => {\r\n return {\r\n ...budget,\r\n date: budget.budgetDate,\r\n };\r\n });\r\n\r\n let totalBillableHours = 0;\r\n let totalNonBillableHours = 0;\r\n let totalFeesBilled = 0;\r\n let totalFeesCollected = 0;\r\n let totalBillableFees = 0;\r\n\r\n staffDailyBudgetData.forEach((budget: StaffDailyBudget) => {\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (moment(budget.budgetDate).isSameOrAfter(sDate) && moment(budget.budgetDate).isSameOrBefore( moment(eDate).subtract(1, 'd').toDate())) {\r\n // tslint:disable-next-line: radix\r\n totalBillableHours += parseFloat(budget.billableHours);\r\n // tslint:disable-next-line: radix\r\n totalNonBillableHours += parseFloat(budget.nonBillableHours);\r\n totalFeesBilled += budget.feesBilled;\r\n totalFeesCollected += budget.feesCollected;\r\n totalBillableFees += budget.billableFees;\r\n }\r\n });\r\n\r\n // tslint:disable-next-line: no-any\r\n const weekly: any = [];\r\n \r\n for (let index = 0; index < weeks.length; index++) {\r\n\r\n const startDate = index === 0 ? sDate : moment().week(weeks[index]).startOf('week').toDate();\r\n // tslint:disable-next-line: max-line-length\r\n const endDate = index === weeks.length - 1 ? moment(eDate).subtract(1, 'd').toDate() : moment().week(weeks[index]).endOf('week').toDate();\r\n\r\n if (staffDailyBudgetData) {\r\n\r\n let billableHours = 0;\r\n let nonBillableHours = 0;\r\n let feesBilled = 0;\r\n let feesCollected = 0;\r\n let billableFees = 0;\r\n\r\n staffDailyBudgetData.forEach((budget: StaffDailyBudget) => {\r\n\r\n if (moment(budget.budgetDate).isSameOrAfter(startDate) && moment(budget.budgetDate).isSameOrBefore(endDate)) {\r\n // tslint:disable-next-line: radix\r\n billableHours += parseFloat(budget.billableHours);\r\n // tslint:disable-next-line: radix\r\n nonBillableHours += parseFloat(budget.nonBillableHours);\r\n feesBilled += budget.feesBilled;\r\n feesCollected += budget.feesCollected;\r\n billableFees += budget.billableFees;\r\n }\r\n });\r\n\r\n weekly.push({\r\n weekNumber: weeks[index],\r\n startDate: moment(startDate).format('MMM DD, YYYY'),\r\n endDate: moment(endDate).format('MMM DD, YYYY'),\r\n billableHours: billableHours,\r\n nonBillableHours: nonBillableHours,\r\n feesBilled: feesBilled,\r\n feesCollected: feesCollected,\r\n billableFees: billableFees,\r\n });\r\n\r\n }\r\n \r\n }\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n events: staffDailyBudgetData,\r\n weekly: weekly,\r\n isLoading: false,\r\n totalBillableHours,\r\n totalNonBillableHours,\r\n totalFeesBilled,\r\n totalFeesCollected,\r\n totalBillableFees,\r\n startDate: sDate,\r\n endDate: moment(eDate).subtract(1, 'd').toDate(),\r\n formData: {\r\n ...prevState.formData,\r\n startDate: sDate,\r\n endDate: moment(eDate).subtract(1, 'd').toDate()\r\n },\r\n staffFinancialYearBudget: staffFinancialYearBudgetData ? {\r\n // tslint:disable-next-line: radix\r\n billableHours: parseFloat(staffFinancialYearBudgetData.billableHours),\r\n // tslint:disable-next-line: radix\r\n nonBillableHours: parseFloat(staffFinancialYearBudgetData.nonBillableHours),\r\n feesBilled: staffFinancialYearBudgetData.feesBilled,\r\n feesCollected: staffFinancialYearBudgetData.feesCollected,\r\n billableFees: staffFinancialYearBudgetData.billableFees,\r\n financialPeriodEndDate: staffFinancialYearBudgetData.financialPeriodEndDate,\r\n financialPeriodStartDate: staffFinancialYearBudgetData.financialPeriodStartDate,\r\n } : null\r\n };\r\n });\r\n\r\n setMonethlyBudgetSubscriptionTriggered(false);\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const handleEventClick = (clickInfo: any) => {\r\n // tslint:disable-next-line: no-console\r\n const { billableHours, nonBillableHours, feesBilled, feesCollected, billableFees} = clickInfo.event._def.extendedProps;\r\n\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n formData: {\r\n ...prevState.formData,\r\n startDate: clickInfo.event.start,\r\n endDate: clickInfo.event.start,\r\n billableAmountPerDay: billableFees,\r\n billableHoursPerDay: billableHours,\r\n nonBillableHoursPerDay: nonBillableHours,\r\n feesBilledPerDay: feesBilled,\r\n feesCollectedPerDay: feesCollected,\r\n },\r\n isDateRangeDisabled: true,\r\n isEditOpen: enableBudgetSync ? false : true,\r\n };\r\n });\r\n\r\n };\r\n\r\n const handleDateClick = (arg: DateClickArg) => {\r\n\r\n // tslint:disable-next-line: no-console\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n formData: {\r\n ...prevState.formData,\r\n startDate: arg.date,\r\n endDate: arg.date,\r\n billableAmountPerDay: 0,\r\n billableHoursPerDay: 0,\r\n nonBillableHoursPerDay: 0,\r\n feesBilledPerDay: 0,\r\n feesCollectedPerDay: 0,\r\n },\r\n isDateRangeDisabled: true,\r\n isEditOpen: enableBudgetSync ? false : true,\r\n };\r\n });\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onClickStaffBudgetForm = (isOpen: boolean) => () => {\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isDateRangeDisabled: false,\r\n isEditOpen: isOpen,\r\n formData: {\r\n ...prevState.formData,\r\n startDate: state.startDate,\r\n endDate: state.endDate,\r\n billableAmountPerDay: 0,\r\n billableHoursPerDay: 0,\r\n nonBillableHoursPerDay: 0,\r\n feesBilledPerDay: 0,\r\n feesCollectedPerDay: 0,\r\n }\r\n };\r\n });\r\n };\r\n\r\n const onAddStaffBudgets = (isOpen: boolean) => () => {\r\n \r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n isAddStaffBudgets: isOpen\r\n };\r\n });\r\n };\r\n\r\n const onToggleChange = (event: React.MouseEvent, viewType: CalendarView) => {\r\n \r\n setState((prevState) => {\r\n\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n \r\n let view: 'dayGridMonth' | 'timeGridWeek' | 'timeGridDay' = 'dayGridMonth';\r\n\r\n if (viewType === CalendarView.DAY_VIEW) {\r\n view = 'timeGridDay';\r\n } else if (viewType === CalendarView.WEEK_VIEW) {\r\n view = 'timeGridWeek';\r\n } else {\r\n view = 'dayGridMonth';\r\n }\r\n\r\n calendarApi.changeView(view);\r\n }\r\n return {\r\n ...prevState,\r\n viewType: viewType\r\n };\r\n });\r\n };\r\n\r\n const onToday = () => {\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n calendarApi.today();\r\n }\r\n };\r\n\r\n const onPrevious = () => {\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n calendarApi.prev();\r\n }\r\n };\r\n\r\n const onNext = () => {\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n calendarApi.next();\r\n }\r\n };\r\n\r\n const onPreviousYear = () => {\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n calendarApi.prevYear();\r\n }\r\n };\r\n\r\n const onNextYear = () => {\r\n if (calendarRef && calendarRef.current) {\r\n const calendarApi: CalendarApi = calendarRef.current.getApi();\r\n calendarApi.nextYear();\r\n }\r\n };\r\n\r\n const formatHours = (value: number) => {\r\n\r\n if (value) {\r\n const hoursToString = `${value}`.split('.');\r\n\r\n const hoursExtracted = hoursToString[0];\r\n\r\n const minutesExtracted = value - Math.floor(value);\r\n\r\n let minutes = 0;\r\n\r\n if (minutesExtracted) {\r\n // tslint:disable-next-line: radix\r\n minutes = minutesExtracted > 0 ? minutesExtracted * 60 : 0;\r\n }\r\n const time = `${hoursExtracted}:${`${Math.round(minutes)}`.padStart(2, '0')}`;\r\n\r\n return time;\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n // tslint:disable-next-line: no-any\r\n const renderEventContent = (eventInfo: any) => {\r\n\r\n const data = eventInfo.event._def.extendedProps;\r\n\r\n return (\r\n
\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) && (\r\n <>\r\n
\r\n
\r\n Billable Hours:\r\n
\r\n
\r\n {formatHours(parseFloat(data.billableHours))}\r\n
\r\n
\r\n
\r\n
\r\n Non Billable Hours:\r\n
\r\n
\r\n {formatHours(parseFloat(data.nonBillableHours))}\r\n
\r\n
\r\n
\r\n
\r\n Fees Recorded:\r\n
\r\n
\r\n {`${symbol}${formatNumber(data.billableFees)}`}\r\n
\r\n
\r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) && (\r\n
\r\n
\r\n Fees Billed:\r\n
\r\n
\r\n {`${symbol}${formatNumber(data.feesBilled)}`}\r\n
\r\n
\r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) && (\r\n
\r\n
\r\n Fees Collected:\r\n
\r\n
\r\n {`${symbol}${formatNumber(data.feesCollected)}`}\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n };\r\n\r\n if (state.isLoading && currencySymbol.loading && staffBudgetSettingQuery.loading) {\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n const symbol = currencySymbol.data?.options.currencySymbol.symbol ? currencySymbol.data?.options.currencySymbol.symbol : '$';\r\n\r\n return (\r\n \r\n \r\n {!!state.isEditOpen && (\r\n \r\n )}\r\n {!!state.isAddStaffBudgets && (\r\n \r\n )}\r\n
\r\n
\r\n Budgets: {staffName}\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{calendarRef.current ? calendarRef.current.getApi().view.title : ''}
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {HasBudgetEditPermission() && !enableBudgetSync && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {/* \r\n \r\n \r\n \r\n */}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n

Total

\r\n
\r\n
\r\n
    \r\n {state.weekly.map((week: WeeklyProps, index: number) => (\r\n
  • \r\n
    {`Week ${index + 1} (${week.startDate} - ${week.endDate})`}
    \r\n
    \r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) && (\r\n <>\r\n
    \r\n
    Billable Hours:
    \r\n
    {formatHours(week.billableHours)}
    \r\n
    \r\n
    \r\n
    Non Billable Hours:
    \r\n
    {formatHours(week.nonBillableHours)}
    \r\n
    \r\n
    \r\n
    Fees Recorded:
    \r\n
    {`${symbol}${formatNumber(Math.round(week.billableFees))}`}
    \r\n
    \r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) && (\r\n
    \r\n
    Fees Billed:
    \r\n
    {`${symbol}${formatNumber(Math.round(week.feesBilled))}`}
    \r\n
    \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) && (\r\n
    \r\n
    Fees Collected:
    \r\n
    {`${symbol}${formatNumber(Math.round(week.feesCollected))}`}
    \r\n
    \r\n )}\r\n
    \r\n
  • \r\n ))}\r\n
\r\n
    \r\n
  • \r\n
    {`${moment(state.startDate).format('MMMM')} Totals`}
    \r\n
    \r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) && (\r\n <>\r\n
    \r\n
    Billable Hours:
    \r\n
    {formatHours(state.totalBillableHours)}
    \r\n
    \r\n
    \r\n
    Non Billable Hours:
    \r\n
    {formatHours(state.totalNonBillableHours)}
    \r\n
    \r\n
    \r\n
    Fees Recorded:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.totalBillableFees))}`}
    \r\n
    \r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) && (\r\n
    \r\n
    Fees Billed:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.totalFeesBilled))}`}
    \r\n
    \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) && (\r\n
    \r\n
    Fees Collected:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.totalFeesCollected))}`}
    \r\n
    \r\n )}\r\n
    \r\n
  • \r\n
\r\n {state.staffFinancialYearBudget && (\r\n
    \r\n
  • \r\n
    {`Year Totals (${moment(state.staffFinancialYearBudget.financialPeriodStartDate).format('MMMM')} to ${moment(state.staffFinancialYearBudget.financialPeriodEndDate).format('MMMM')})`}
    \r\n
    \r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) && (\r\n <>\r\n
    \r\n
    Billable Hours:
    \r\n
    {formatHours(state.staffFinancialYearBudget.billableHours)}
    \r\n
    \r\n
    \r\n
    Non Billable Hours:
    \r\n
    {formatHours(state.staffFinancialYearBudget.nonBillableHours)}
    \r\n
    \r\n
    \r\n
    Fees Recorded:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.staffFinancialYearBudget.billableFees))}`}
    \r\n
    \r\n \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) && (\r\n
    \r\n
    Fees Billed:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.staffFinancialYearBudget.feesBilled))}`}
    \r\n
    \r\n )}\r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) && (\r\n
    \r\n
    Fees Collected:
    \r\n
    {`${symbol}${formatNumber(Math.round(state.staffFinancialYearBudget.feesCollected))}`}
    \r\n
    \r\n )}\r\n
    \r\n
  • \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nconst StaffDailyBudgetNotificationSubscription = gql`\r\n subscription staffDailyBudgetNotification {\r\n updateStaffDailyBudgetNotification{\r\n id,\r\n status,\r\n message,\r\n description\r\n }\r\n }\r\n`;\r\n\r\nconst UPDATE_STAFF_MONTHLY_BUDGET_SUBSCRIPTION = gql`\r\n subscription UpdateStaffMonthlyBudgetSubscription{\r\n updateStaffMonthlyBudgetNotification {\r\n id,\r\n description,\r\n message,\r\n status\r\n }\r\n }\r\n`;\r\n\r\nexport interface StaffBudgetSettingsQueryData {\r\n settings: Settings;\r\n}\r\n\r\nexport interface Settings {\r\n applications: Applications;\r\n}\r\n\r\nexport interface Applications {\r\n staffBudgetSettings: StaffBudgetSettings;\r\n}\r\n\r\nexport interface StaffBudgetSettings {\r\n config: Config;\r\n}\r\n\r\nexport interface Config {\r\n enableBudgetSync: boolean;\r\n}\r\n\r\nconst STAFF_BUDGET_SETTINGS_QUERY = gql`\r\n query StaffBudgetSettingsQuery {\r\n settings {\r\n applications {\r\n staffBudgetSettings {\r\n config {\r\n enableBudgetSync\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;","import React, { useState, useEffect } from 'react';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\nimport { Autocomplete, RenderInputParams } from '@material-ui/lab';\r\nimport { TextField, CircularProgress } from '@material-ui/core';\r\nimport match from 'autosuggest-highlight/match';\r\nimport parse from 'autosuggest-highlight/parse';\r\nimport { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport gql from 'graphql-tag';\r\nimport { useQuery } from 'react-apollo';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n minWidth: '200px',\r\n },\r\n })\r\n);\r\n\r\ninterface StaffSelectorAutoCompleteProps {\r\n disabled?: boolean;\r\n required?: boolean;\r\n multiple?: boolean;\r\n // tslint:disable-next-line: no-any\r\n value?: IAutoCompleteItem | any; // value only available in single select\r\n error?: boolean;\r\n onSelection?: (value: IAutoCompleteItem | IAutoCompleteItem[], name: string) => void;\r\n className?: string;\r\n helperText?: string;\r\n name?: string;\r\n label?: string;\r\n disablePortal?: boolean;\r\n}\r\n\r\ninterface StaffSelectorAutoCompleteState {\r\n isLoading: boolean;\r\n options: IAutoCompleteItem[];\r\n}\r\n\r\nexport const StaffSelectorAutoComplete: React.FC = props => {\r\n\r\n const classes = useStyles();\r\n\r\n const [state, setState] = useState({\r\n isLoading: true,\r\n options: [],\r\n });\r\n\r\n const staffQuery = useQuery(STAFF_ROLE_QUERY);\r\n\r\n useEffect(() => {\r\n if (staffQuery.data && !staffQuery.loading && !staffQuery.error) {\r\n\r\n const staffRoles = staffQuery.data ? staffQuery.data.staffRoleList.staffRole : [];\r\n setState((prevState) => {\r\n return {\r\n ...prevState,\r\n options: staffRoles.map( (source: StaffRole) => ({value: source.description, label: source.description })),\r\n isLoading: false\r\n };\r\n });\r\n }\r\n // tslint:disable-next-line: align\r\n }, [staffQuery.data, staffQuery.loading, staffQuery.error]);\r\n\r\n // tslint:disable-next-line: no-any\r\n const handleChange = (event: React.ChangeEvent<{}>, value: any) => {\r\n if (props.onSelection) {\r\n props.onSelection(value, props.name ? props.name : 'staffRole');\r\n }\r\n };\r\n\r\n const getInputProps = (params: RenderInputParams, isLoading?: boolean) => {\r\n return ({ \r\n ...params.InputProps,\r\n endAdornment: (\r\n \r\n {isLoading ? : null}\r\n {params.InputProps.endAdornment}\r\n \r\n ), \r\n });\r\n };\r\n\r\n return (\r\n
\r\n { props.multiple ? \r\n (\r\n option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n const matches = match(option.label, inputValue);\r\n const parts = parse(option.label, matches);\r\n \r\n return (\r\n
\r\n {parts.map((part, index) => (\r\n \r\n {part.text}\r\n \r\n ))}\r\n
\r\n );\r\n }}\r\n />\r\n )\r\n :\r\n (\r\n option.label} \r\n getOptionSelected={(option, value) => value.value === option.value} \r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderInput={params => (\r\n \r\n )}\r\n // tslint:disable-next-line: jsx-no-lambda\r\n renderOption={(option, { inputValue }) => {\r\n const matches = match(option.label, inputValue);\r\n const parts = parse(option.label, matches);\r\n \r\n return (\r\n
\r\n {parts.map((part, index) => (\r\n \r\n {part.text}\r\n \r\n ))}\r\n
\r\n );\r\n }}\r\n />\r\n )\r\n }\r\n
\r\n );\r\n};\r\n\r\nexport interface StaffRoleData {\r\n staffRoleList: StaffRoleList;\r\n}\r\n\r\nexport interface StaffRoleList {\r\n recordCount: number;\r\n staffRole: StaffRole[];\r\n}\r\n\r\nexport interface StaffRole {\r\n id: number;\r\n description: string;\r\n}\r\n\r\nconst STAFF_ROLE_QUERY = gql`\r\n query staffRole {\r\n staffRoleList {\r\n recordCount,\r\n staffRole{\r\n id,\r\n description\r\n }\r\n }\r\n }\r\n`;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport { Button, Drawer, Grid, makeStyles, Typography } from '@material-ui/core';\r\nimport React, { useEffect } from 'react';\r\nimport { Field, Form, FormSpy } from 'react-final-form';\r\nimport { FormApi, SubmissionErrors } from 'final-form';\r\nimport { StaffSelectorAutoComplete } from '../selectors/StaffSelectorAutoComplete';\r\nimport { IAutoCompleteItem } from '../../typings/autoComplete';\r\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker/DatePicker';\r\nimport gql from 'graphql-tag';\r\nimport { useMutation } from 'react-apollo';\r\nimport { showNotification } from '../../App';\r\nimport moment from 'moment';\r\n\r\nconst useStyles = makeStyles({\r\n paperRoot: {\r\n maxWidth: '650px',\r\n padding: '15px'\r\n },\r\n textField: {\r\n width: '100%'\r\n },\r\n butotnContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n margin: '0 -10px',\r\n justifyContent: 'flex-end'\r\n },\r\n actionButton: {\r\n margin: '0 10px'\r\n },\r\n title: {\r\n fontSize: '14px',\r\n fontWeight: 600\r\n }\r\n});\r\n\r\ninterface EditStaffBudgetDrawerProps {\r\n open: boolean;\r\n onClose?: () => void;\r\n // tslint:disable-next-line: no-any\r\n data: any;\r\n}\r\n\r\ninterface EditStaffBudgetForm {\r\n partyGuid: string;\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n staffClassification: IAutoCompleteItem | null;\r\n}\r\n\r\nexport const EditStaffBudgetDrawer: React.FC = (props) => {\r\n\r\n const classes = useStyles();\r\n\r\n const [formState] = React.useState({\r\n partyGuid: props.data.staffGuid,\r\n startDate: props.data.startDate ? props.data.startDate : null,\r\n endDate: props.data.endDate ? props.data.endDate : null,\r\n staffClassification: props.data.staffRole ? { label: props.data.staffRole, value: props.data.staffRole } : null\r\n });\r\n\r\n // tslint:disable-next-line: no-any\r\n const [updateStaff, updateStaffProperty] = useMutation(UPDATE_STAFF_MUTATION);\r\n\r\n useEffect(() => {\r\n if (updateStaffProperty.data && updateStaffProperty.data.updateStaff) {\r\n showNotification(null, 'Successfully submitted', 'info'); \r\n if (props.onClose) {\r\n props.onClose();\r\n }\r\n }\r\n // tslint:disable-next-line: align\r\n }, [updateStaffProperty.data]);\r\n\r\n // tslint:disable-next-line: no-any\r\n // const required = (value: any) => {\r\n // return value ? undefined : 'Required';\r\n // };\r\n\r\n // tslint:disable-next-line: no-any\r\n const onSubmit = (values: EditStaffBudgetForm, form: FormApi, callback?: (errors?: SubmissionErrors) => void) => {\r\n updateStaff({\r\n variables: {\r\n partyGuid: values.partyGuid,\r\n endDate: values.endDate ? moment(values.endDate).toDate() : values.endDate,\r\n staffRole: values.staffClassification ? values.staffClassification.value : null,\r\n startDate: values.startDate ? moment(values.startDate).toDate() : values.startDate,\r\n updateFromRedView: true\r\n }\r\n });\r\n };\r\n\r\n const actionButton = (\r\n form: FormApi,\r\n submitting: boolean,\r\n pristine: boolean,\r\n // tslint:disable-next-line: no-any\r\n values: any\r\n ) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n return (\r\n \r\n true}\r\n keepDirtyOnReinitialize={true}\r\n // validate={validate}\r\n render={({ \r\n handleSubmit,\r\n form,\r\n submitting,\r\n pristine,\r\n values\r\n }) => (\r\n
\r\n \r\n \r\n Edit Staff Details\r\n \r\n \r\n {/* tslint:disable-next-line: no-shadowed-variable */}\r\n {({ values }) => (\r\n <>\r\n \r\n \r\n {({ input, meta }) => (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n {({ input, meta }) => (\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {({ input, meta }) => (\r\n \r\n input.onChange(selection)\r\n }\r\n helperText={\r\n meta.error &&\r\n meta.touched\r\n ? 'Staff Classification is required'\r\n : ''\r\n }\r\n disablePortal={false}\r\n />\r\n )}\r\n \r\n \r\n \r\n {actionButton(form, submitting, pristine, values)}\r\n \r\n \r\n
\r\n )}\r\n />\r\n
\r\n );\r\n};\r\n\r\ninterface UpdateStaffMutationParams {\r\n partyGuid: string;\r\n startDate: Date | null;\r\n endDate: Date | null;\r\n staffRole: string | null;\r\n updateFromRedView: Boolean;\r\n}\r\n\r\nconst UPDATE_STAFF_MUTATION = gql`\r\n mutation UpdateStaffMutation($partyGuid: String, $startDate: DateTime, $endDate: DateTime, $staffRole: String, $updateFromRedView: Boolean) {\r\n updateStaff(\r\n partyGuid: $partyGuid,\r\n startDate: $startDate,\r\n endDate: $endDate,\r\n staffRole: $staffRole,\r\n updateFromRedView: $updateFromRedView\r\n )\r\n }\r\n`;","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useState } from 'react';\r\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\r\nimport {\r\n Popper,\r\n Grow,\r\n Paper,\r\n ClickAwayListener,\r\n MenuList,\r\n MenuItem,\r\n IconButton\r\n} from '@material-ui/core';\r\nimport { RvLoader } from '../components/Loader';\r\nimport MoreHorizOutlinedIcon from '@material-ui/icons/MoreHorizOutlined';\r\nimport { StaffBudgetMaintenanceModal } from './modals/StaffBudgetMaintenanceModal';\r\nimport DateRangeOutlinedIcon from '@material-ui/icons/DateRangeOutlined';\r\nimport { UserFeature, UserFeatureEnum } from '../types/UserFeature';\r\nimport EditOutlinedIcon from '@material-ui/icons/EditOutlined';\r\nimport { EditStaffBudgetDrawer } from './drawer/EditStaffBudgetDrawer';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n // position: 'fixed',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n },\r\n loaderWrapper: {\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n right: 0,\r\n left: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n menuItem: {\r\n color: '#5173FF',\r\n },\r\n menuIcon: {\r\n marginRight: '10px',\r\n color: '#5173FF'\r\n },\r\n })\r\n);\r\n\r\nexport enum StaffTaskActionEnum {\r\n Budget = 1,\r\n Edit\r\n}\r\n\r\ninterface StaffTaskActionProps {\r\n // tslint:disable-next-line: no-any\r\n data?: any;\r\n staffGuid: string;\r\n}\r\n\r\ninterface StaffTaskActionState {\r\n isBudgetFormOpen: boolean;\r\n isEditFormOpen: boolean;\r\n}\r\n// tslint:disable-next-line: no-any\r\nexport const StaffTaskAction: React.FC = ( props ) => {\r\n const classes = useStyles();\r\n const anchorRef = React.useRef(null);\r\n \r\n const [isLoading, setIsLoading] = useState(false);\r\n const [open, setOpen] = useState(false);\r\n\r\n const [state, setState] = useState({\r\n isBudgetFormOpen: false,\r\n isEditFormOpen: false\r\n });\r\n const staffId: string | undefined = props.data && props.data.staffId ? props.data.staffId : undefined;\r\n\r\n const handleToggle = () => {\r\n // tslint:disable-next-line: no-shadowed-variable\r\n setOpen(prevOpen => !prevOpen);\r\n setIsLoading(false);\r\n };\r\n\r\n const handleClose = (event: React.MouseEvent) => {\r\n if (anchorRef.current &&\r\n anchorRef.current.contains(event.target as HTMLElement)\r\n ) {\r\n return;\r\n }\r\n\r\n setOpen(false);\r\n };\r\n\r\n const archorEvent = (event: React.MouseEvent) => {\r\n if (anchorRef.current &&\r\n anchorRef.current.contains(event.target as HTMLElement)) {\r\n return;\r\n }\r\n };\r\n\r\n const handleClickMenu = (menu: StaffTaskActionEnum) => (event: React.MouseEvent) => {\r\n if (anchorRef.current &&\r\n anchorRef.current.contains(event.target as HTMLElement)\r\n ) {\r\n return;\r\n }\r\n\r\n switch (menu) {\r\n case StaffTaskActionEnum.Budget : {\r\n setOpen(false);\r\n onBudgetFormOpen(event);\r\n break;\r\n } \r\n case StaffTaskActionEnum.Edit : {\r\n setOpen(false);\r\n onEditFormOpen(event);\r\n break;\r\n } \r\n default: {\r\n setOpen(false);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const onBudgetFormOpen = (event: React.MouseEvent) => {\r\n archorEvent(event);\r\n setOpen(false);\r\n\r\n setState({\r\n ...state,\r\n isBudgetFormOpen: true\r\n });\r\n };\r\n\r\n const onEditFormOpen = (event: React.MouseEvent) => {\r\n archorEvent(event);\r\n setOpen(false);\r\n\r\n setState({\r\n ...state,\r\n isEditFormOpen: true\r\n });\r\n };\r\n \r\n const onBudgetFormClosed = () => {\r\n\r\n setState({\r\n ...state,\r\n isBudgetFormOpen: false\r\n });\r\n };\r\n\r\n const onCloseEditForm = () => {\r\n\r\n setState({\r\n ...state,\r\n isEditFormOpen: false\r\n });\r\n };\r\n\r\n // const onDialogClose = () => {\r\n // setOpen(false);\r\n\r\n // setState({\r\n // ...state,\r\n // isBudgetFormOpen: false\r\n // });\r\n // };\r\n\r\n function handleListKeyDown(event: React.KeyboardEvent) {\r\n if (event.key === 'Tab') {\r\n event.preventDefault();\r\n setOpen(false);\r\n }\r\n }\r\n\r\n // return focus to the button when we transitioned from !open -> open\r\n const prevOpen = React.useRef(open);\r\n React.useEffect(() => {\r\n if (prevOpen.current === true && open === false) {\r\n anchorRef.current!.focus();\r\n }\r\n\r\n prevOpen.current = open;\r\n // tslint:disable-next-line: align\r\n }, [open]);\r\n\r\n const getTaskActions = () => {\r\n if (staffId) {\r\n return (\r\n \r\n {state.isBudgetFormOpen && (\r\n \r\n )}\r\n {state.isEditFormOpen && (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n };\r\n\r\n const getLoader = () => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n };\r\n\r\n const getMenuItems = () => {\r\n return (\r\n \r\n \r\n {({ TransitionProps, placement }) => (\r\n \r\n \r\n \r\n \r\n \r\n {UserFeature.HasAccess(UserFeatureEnum.hasStaffMaintenance) && (\r\n \r\n \r\n Edit\r\n \r\n )}\r\n \r\n \r\n Maintain Budgets\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n };\r\n\r\n const hasBudgetPermission = () => {\r\n return UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsView) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsEdit) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsView) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsEdit) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionView) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionEdit);\r\n };\r\n\r\n return (\r\n
\r\n {hasBudgetPermission() && (\r\n \r\n \r\n \r\n )}\r\n\r\n {\r\n isLoading\r\n ? getLoader()\r\n : getMenuItems() \r\n }\r\n\r\n {getTaskActions()} \r\n
\r\n );\r\n};\r\n","import { DataType } from '../components/DataDisplay/ValueFormatter';\r\nimport { UserFeature, UserFeatureEnum } from '../types/UserFeature';\r\nimport { StaffTaskAction } from './StaffTaskAction';\r\nvar menuTabs = ['filterMenuTab', 'generalMenuTab', 'columnsMenuTab'];\r\n\r\nexport function HasBudgetEditPermission(): boolean {\r\n return UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetCollectionsEdit) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetBillingsEdit) ||\r\n UserFeature.HasAccess(UserFeatureEnum.hasStaffBudgetProductionEdit);\r\n}\r\n\r\nexport enum cellClassEnum {\r\n numberType = 'numberType',\r\n currencyType = 'currencyType',\r\n stringType = 'stringType',\r\n dateTimeType = 'dateTimeType',\r\n dateType = 'dateType',\r\n booleanType = 'booleanType',\r\n actionType = 'actionType',\r\n imageType = 'imageType',\r\n currencyWithoutDecimalsType = 'currencyWithoutDecimalsType',\r\n percentageType = 'percentageType',\r\n linkType = 'linkType',\r\n checkboxType = 'checkboxType',\r\n editorViewType = 'editorViewType',\r\n durationType = 'durationType',\r\n chipsType = 'chipsType',\r\n contextMenuStaffType = 'contextMenuStaffType',\r\n dueDateType = 'dueDateType',\r\n timeType = 'timeType',\r\n ratingType = 'ratingType',\r\n dateMonthYear = 'dateMonthYear'\r\n}\r\n \r\nexport const StaffSummaryColumns = [\r\n {\r\n field: 'action',\r\n format: DataType.ContextMenuStaff,\r\n headerName: '', \r\n cellStyle: { overflow: 'visible' },\r\n width: 70,\r\n pinned: 'left',\r\n suppressMenu: true,\r\n autoHeight: true,\r\n resizable: false,\r\n lockPosition: true,\r\n lockPinned: true,\r\n cellRendererFramework: StaffTaskAction, // ActionCellRenderer\r\n cellClass: cellClassEnum.actionType\r\n },\r\n {\r\n headerName: 'Name', \r\n field: 'name', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType\r\n },\r\n {\r\n headerName: 'Email', \r\n field: 'emailAddress', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType\r\n },\r\n {\r\n headerName: 'Mobile', \r\n field: 'mobile', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType\r\n },\r\n {\r\n headerName: 'Phone', \r\n field: 'phone', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType\r\n },\r\n {\r\n headerName: 'Staff Classification', \r\n field: 'staffRole', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'Start Date', \r\n field: 'startDate', \r\n format: DataType.Date,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.dateType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'End Date', \r\n field: 'endDate', \r\n format: DataType.Date,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.dateType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'PMS Access', \r\n field: 'isLicensed', \r\n format: DataType.Boolean,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.booleanType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'Office', \r\n field: 'office', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'Department', \r\n field: 'department', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType,\r\n hide: false\r\n },\r\n {\r\n headerName: 'Team', \r\n field: 'team', \r\n format: DataType.String,\r\n enableRowGroup: true, \r\n suppressSizeToFit: true,\r\n width: 240,\r\n menuTabs: menuTabs,\r\n cellClass: cellClassEnum.stringType,\r\n hide: false\r\n },\r\n];\r\n\r\n// .filter((value) => HasBudgetPermission() ? value : value.field !== 'action');"],"sourceRoot":""}