diff --git a/assets/pasted-20260413-130727-e67a0305.png b/assets/pasted-20260413-130727-e67a0305.png new file mode 100644 index 0000000..c288ed6 Binary files /dev/null and b/assets/pasted-20260413-130727-e67a0305.png differ diff --git a/assets/pasted-20260413-131715-2c4e92ec.png b/assets/pasted-20260413-131715-2c4e92ec.png new file mode 100644 index 0000000..bb84091 Binary files /dev/null and b/assets/pasted-20260413-131715-2c4e92ec.png differ diff --git a/backend/src/db/api/payroll_runs.js b/backend/src/db/api/payroll_runs.js index 554b706..c06458c 100644 --- a/backend/src/db/api/payroll_runs.js +++ b/backend/src/db/api/payroll_runs.js @@ -240,9 +240,19 @@ module.exports = class Payroll_runsDBApi { - output.payroll_line_items_payroll_run = await payroll_runs.getPayroll_line_items_payroll_run({ - transaction - }); + output.payroll_line_items_payroll_run = await Promise.all( + (await payroll_runs.getPayroll_line_items_payroll_run({ + transaction + })).map(async (payrollLineItem) => { + const payrollLineItemOutput = payrollLineItem.get({ plain: true }); + + payrollLineItemOutput.employee = await payrollLineItem.getEmployee({ + transaction, + }); + + return payrollLineItemOutput; + }), + ); diff --git a/backend/src/routes/payroll_generator.js b/backend/src/routes/payroll_generator.js index 4adea9d..4503435 100644 --- a/backend/src/routes/payroll_generator.js +++ b/backend/src/routes/payroll_generator.js @@ -5,6 +5,11 @@ const db = require('../db/models'); const { wrapAsync } = require('../helpers'); const { Op } = require('sequelize'); +const getInclusiveDateRange = (startDate, endDate) => ({ + start: new Date(`${startDate}T00:00:00.000Z`), + end: new Date(`${endDate}T23:59:59.999Z`), +}); + router.post('/preview', passport.authenticate('jwt', { session: false }), wrapAsync(async (req, res) => { const { startDate, endDate } = req.body; @@ -12,11 +17,13 @@ router.post('/preview', passport.authenticate('jwt', { session: false }), wrapAs return res.status(400).send('startDate and endDate are required'); } + const { start, end } = getInclusiveDateRange(startDate, endDate); + // Find job logs in range that are not paid const jobLogs = await db.job_logs.findAll({ where: { work_date: { - [Op.between]: [new Date(startDate), new Date(endDate)] + [Op.between]: [start, end] }, status: { [Op.ne]: 'paid' @@ -85,11 +92,13 @@ router.post('/generate', passport.authenticate('jwt', { session: false }), wrapA return res.status(400).send('startDate and endDate are required'); } + const { start, end } = getInclusiveDateRange(startDate, endDate); + // Find job logs const jobLogs = await db.job_logs.findAll({ where: { work_date: { - [Op.between]: [new Date(startDate), new Date(endDate)] + [Op.between]: [start, end] }, status: { [Op.ne]: 'paid' diff --git a/frontend/public/assets/vm-shot-2026-04-13T13-17-17-604Z.jpg b/frontend/public/assets/vm-shot-2026-04-13T13-17-17-604Z.jpg new file mode 100644 index 0000000..dee1594 Binary files /dev/null and b/frontend/public/assets/vm-shot-2026-04-13T13-17-17-604Z.jpg differ diff --git a/frontend/src/components/Job_logs/configureJob_logsCols.tsx b/frontend/src/components/Job_logs/configureJob_logsCols.tsx index 3585223..2f75d3d 100644 --- a/frontend/src/components/Job_logs/configureJob_logsCols.tsx +++ b/frontend/src/components/Job_logs/configureJob_logsCols.tsx @@ -218,52 +218,7 @@ export const loadColumns = async ( }, - { - field: 'odometer_start', - headerName: 'OdometerStart', - flex: 1, - minWidth: 120, - filterable: false, - headerClassName: 'datagrid--header', - cellClassName: 'datagrid--cell', - - - editable: hasUpdatePermission, - - type: 'number', - - }, - - { - field: 'odometer_end', - headerName: 'OdometerEnd', - flex: 1, - minWidth: 120, - filterable: false, - headerClassName: 'datagrid--header', - cellClassName: 'datagrid--cell', - - - editable: hasUpdatePermission, - - type: 'number', - - }, - - { - field: 'job_address', - headerName: 'JobAddress', - flex: 1, - minWidth: 120, - filterable: false, - headerClassName: 'datagrid--header', - cellClassName: 'datagrid--cell', - - - editable: hasUpdatePermission, - - - }, + { field: 'status', diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index dde7fa5..79f9bd7 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -84,28 +84,12 @@ const menuAside: MenuAsideItem[] = [ icon: 'mdiLinkVariant' in icon ? icon['mdiLinkVariant' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable, permissions: 'UPDATE_USERS' }, - { - href: '/chemical_products/chemical_products-list', - label: 'Chemical products', - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - icon: 'mdiFlask' in icon ? icon['mdiFlask' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable, - permissions: 'UPDATE_USERS' - }, { href: '/job_logs/job_logs-list', label: 'All Job Logs', icon: 'mdiClipboardTextClock' in icon ? icon['mdiClipboardTextClock' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable, permissions: 'UPDATE_USERS' }, - { - href: '/job_chemical_usages/job_chemical_usages-list', - label: 'Job chemical usages', - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - icon: 'mdiFlaskOutline' in icon ? icon['mdiFlaskOutline' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable, - permissions: 'UPDATE_USERS' - }, { href: '/payroll_runs/payroll_runs-list', label: 'Payroll runs', diff --git a/frontend/src/pages/dashboard.tsx b/frontend/src/pages/dashboard.tsx index dc96fdb..e40be66 100644 --- a/frontend/src/pages/dashboard.tsx +++ b/frontend/src/pages/dashboard.tsx @@ -32,9 +32,7 @@ const Dashboard = () => { const [vehicles, setVehicles] = React.useState(loadingMessage); const [pay_types, setPay_types] = React.useState(loadingMessage); const [employee_pay_types, setEmployee_pay_types] = React.useState(loadingMessage); - const [chemical_products, setChemical_products] = React.useState(loadingMessage); const [job_logs, setJob_logs] = React.useState(loadingMessage); - const [job_chemical_usages, setJob_chemical_usages] = React.useState(loadingMessage); const [payroll_runs, setPayroll_runs] = React.useState(loadingMessage); const [payroll_line_items, setPayroll_line_items] = React.useState(loadingMessage); @@ -58,8 +56,8 @@ const Dashboard = () => { return; } - const entities = ['users','roles','permissions','customers','vehicles','pay_types','employee_pay_types','chemical_products','job_logs','job_chemical_usages','payroll_runs','payroll_line_items',]; - const fns = [setUsers,setRoles,setPermissions,setCustomers,setVehicles,setPay_types,setEmployee_pay_types,setChemical_products,setJob_logs,setJob_chemical_usages,setPayroll_runs,setPayroll_line_items,]; + const entities = ['users','roles','permissions','customers','vehicles','pay_types','employee_pay_types','job_logs','payroll_runs','payroll_line_items',]; + const fns = [setUsers,setRoles,setPermissions,setCustomers,setVehicles,setPay_types,setEmployee_pay_types,setJob_logs,setPayroll_runs,setPayroll_line_items,]; const requests = entities.map((entity, index) => { @@ -355,34 +353,6 @@ const Dashboard = () => { } - {hasPermission(currentUser, 'READ_CHEMICAL_PRODUCTS') && -
OdometerStart
-{job_logs?.odometer_start || 'No data'}
-OdometerEnd
-{job_logs?.odometer_end || 'No data'}
-JobAddress
-{job_logs?.job_address}
-Status
{job_logs?.status ?? 'No data'}
@@ -600,65 +479,6 @@ const Job_logsView = () => { - <> -Job_chemical_usages JobLog
-| QuantityUsed | - - - -Notes | - - -
|---|---|
| - { item.quantity_used } - | - - - -- { item.notes } - | - - -