WIP Payroll Commit process.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
<babeledit_project version="1.2" be_version="2.7.1">
|
<babeledit_project be_version="2.7.1" version="1.2">
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
BabelEdit project file
|
BabelEdit project file
|
||||||
@@ -6898,6 +6898,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>editcommitted</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>enter</name>
|
<name>enter</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -7293,6 +7314,48 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>invoiceexemptcode</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>itemexemptcode</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>la1</name>
|
<name>la1</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -26833,6 +26896,27 @@
|
|||||||
<folder_node>
|
<folder_node>
|
||||||
<name>labels</name>
|
<name>labels</name>
|
||||||
<children>
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>act_price_ppc</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>actual_completion_inferred</name>
|
<name>actual_completion_inferred</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -29467,6 +29551,27 @@
|
|||||||
</concept_node>
|
</concept_node>
|
||||||
</children>
|
</children>
|
||||||
</folder_node>
|
</folder_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>ppc</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>profileadjustments</name>
|
<name>profileadjustments</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -44675,6 +44780,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>committed</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>cost_center</name>
|
<name>cost_center</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -44759,6 +44885,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>employee_team</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>flat_rate</name>
|
<name>flat_rate</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -47392,6 +47539,37 @@
|
|||||||
</concept_node>
|
</concept_node>
|
||||||
</children>
|
</children>
|
||||||
</folder_node>
|
</folder_node>
|
||||||
|
<folder_node>
|
||||||
|
<name>tt_approvals</name>
|
||||||
|
<children>
|
||||||
|
<folder_node>
|
||||||
|
<name>actions</name>
|
||||||
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>approveselected</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
</children>
|
||||||
|
</folder_node>
|
||||||
|
</children>
|
||||||
|
</folder_node>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
<name>user</name>
|
<name>user</name>
|
||||||
<children>
|
<children>
|
||||||
|
|||||||
@@ -532,6 +532,18 @@ export function ShopInfoRbacComponent({ form, bodyshop }) {
|
|||||||
>
|
>
|
||||||
<InputNumber />
|
<InputNumber />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.rbac.timetickets.editcommitted")}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
name={["md_rbac", "timetickets:editcommitted"]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.rbac.ttapprovals.view")}
|
label={t("bodyshop.fields.rbac.ttapprovals.view")}
|
||||||
rules={[
|
rules={[
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { EditFilled } from "@ant-design/icons";
|
import { EditFilled } from "@ant-design/icons";
|
||||||
import { Button, Card, Space, Table } from "antd";
|
import { Button, Card, Checkbox, Space, Table } from "antd";
|
||||||
import Dinero from "dinero.js";
|
import Dinero from "dinero.js";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import React, { useMemo, useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
@@ -62,6 +62,14 @@ export function TimeTicketList({
|
|||||||
}, [timetickets]);
|
}, [timetickets]);
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
|
{
|
||||||
|
title: t("timetickets.fields.committed"),
|
||||||
|
dataIndex: "committed_at",
|
||||||
|
key: "committed_at",
|
||||||
|
render: (text, record) => (
|
||||||
|
<Checkbox disabled checked={record.committed_at} />
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t("timetickets.fields.date"),
|
title: t("timetickets.fields.date"),
|
||||||
dataIndex: "date",
|
dataIndex: "date",
|
||||||
@@ -236,6 +244,11 @@ export function TimeTicketList({
|
|||||||
timeticket: record,
|
timeticket: record,
|
||||||
}}
|
}}
|
||||||
disabled={
|
disabled={
|
||||||
|
HasRbacAccess({
|
||||||
|
bodyshop,
|
||||||
|
authLevel: authLevel,
|
||||||
|
action: "timetickets:editcommitted",
|
||||||
|
}) &&
|
||||||
HasRbacAccess({
|
HasRbacAccess({
|
||||||
bodyshop,
|
bodyshop,
|
||||||
authLevel: authLevel,
|
authLevel: authLevel,
|
||||||
@@ -271,7 +284,6 @@ export function TimeTicketList({
|
|||||||
}
|
}
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setTimeTicketTaskContext();
|
|
||||||
setTimeTicketTaskContext({
|
setTimeTicketTaskContext({
|
||||||
actions: {},
|
actions: {},
|
||||||
context: { jobid: jobId },
|
context: { jobid: jobId },
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
Space,
|
Space,
|
||||||
Table,
|
Table,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
|
import _ from "lodash";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
@@ -19,10 +20,9 @@ import EmployeeSearchSelectComponent from "../employee-search-select/employee-se
|
|||||||
import EmployeeTeamSearchSelectComponent from "../employee-team-search-select/employee-team-search-select.component";
|
import EmployeeTeamSearchSelectComponent from "../employee-team-search-select/employee-team-search-select.component";
|
||||||
import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component";
|
import FormDateTimePickerComponent from "../form-date-time-picker/form-date-time-picker.component";
|
||||||
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
||||||
|
import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility";
|
||||||
import { LaborAllocationContainer } from "../time-ticket-modal/time-ticket-modal.component";
|
import { LaborAllocationContainer } from "../time-ticket-modal/time-ticket-modal.component";
|
||||||
import TimeTicketsTasksPresets from "../time-ticket-tasks-presets/time-ticket-tasks-presets.component";
|
import TimeTicketsTasksPresets from "../time-ticket-tasks-presets/time-ticket-tasks-presets.component";
|
||||||
import { CalculateAllocationsTotals } from "../labor-allocations-table/labor-allocations-table.utility";
|
|
||||||
import _ from "lodash";
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
@@ -39,7 +39,6 @@ export default connect(
|
|||||||
export function TimeTicketTaskModalComponent({
|
export function TimeTicketTaskModalComponent({
|
||||||
bodyshop,
|
bodyshop,
|
||||||
form,
|
form,
|
||||||
employeeAutoCompleteOptions,
|
|
||||||
lineTicketCalled,
|
lineTicketCalled,
|
||||||
calculateTimeTickets,
|
calculateTimeTickets,
|
||||||
lineTicketLoading,
|
lineTicketLoading,
|
||||||
@@ -72,18 +71,6 @@ export function TimeTicketTaskModalComponent({
|
|||||||
/>
|
/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item name="employeeid" label={t("timetickets.fields.employee")}>
|
|
||||||
<EmployeeSearchSelectComponent
|
|
||||||
options={employeeAutoCompleteOptions}
|
|
||||||
allowClear
|
|
||||||
onSelect={(value) => {
|
|
||||||
const emps =
|
|
||||||
employeeAutoCompleteOptions &&
|
|
||||||
employeeAutoCompleteOptions.filter((e) => e.id === value)[0];
|
|
||||||
form.setFieldsValue({ flat_rate: emps && emps.flat_rate });
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="employeeteamid"
|
name="employeeteamid"
|
||||||
label={t("timetickets.fields.employee_team")}
|
label={t("timetickets.fields.employee_team")}
|
||||||
@@ -243,7 +230,13 @@ export function TimeTicketTaskModalComponent({
|
|||||||
{errors.map((e, idx) => (
|
{errors.map((e, idx) => (
|
||||||
<Alert key={idx} message={e} />
|
<Alert key={idx} message={e} />
|
||||||
))}
|
))}
|
||||||
<div style={{ display: "none" }}>
|
<div
|
||||||
|
style={
|
||||||
|
{
|
||||||
|
//display: "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
>
|
||||||
{fields.map((field, index) => (
|
{fields.map((field, index) => (
|
||||||
<Form.Item
|
<Form.Item
|
||||||
key={field.key}
|
key={field.key}
|
||||||
@@ -358,7 +351,7 @@ export function TimeTicketTaskModalComponent({
|
|||||||
!lineTicketLoading)
|
!lineTicketLoading)
|
||||||
) {
|
) {
|
||||||
queryJobInfo({ variables: { id: jobid } }).then(() =>
|
queryJobInfo({ variables: { id: jobid } }).then(() =>
|
||||||
calculateTimeTickets()
|
calculateTimeTickets("")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
nextFetchPolicy: "network-only",
|
nextFetchPolicy: "network-only",
|
||||||
});
|
});
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [insertTimeTickets] = useMutation(INSERT_NEW_TIME_TICKET);
|
const [insertTimeTickets] = useMutation(INSERT_NEW_TIME_TICKET);
|
||||||
const [insertTimeTicketApproval] = useMutation(INSERT_NEW_TT_APPROVALS);
|
const [insertTimeTicketApproval] = useMutation(INSERT_NEW_TT_APPROVALS);
|
||||||
@@ -56,7 +57,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
const result = await insertTimeTicketApproval({
|
const result = await insertTimeTicketApproval({
|
||||||
variables: {
|
variables: {
|
||||||
timeTicketInput: values.timetickets.map((ticket) => ({
|
timeTicketInput: values.timetickets.map((ticket) => ({
|
||||||
..._.omit(ticket, "pay"),
|
..._.omit(ticket, "pay"),
|
||||||
bodyshopid: bodyshop.id,
|
bodyshopid: bodyshop.id,
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
@@ -73,6 +74,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
type: "success",
|
type: "success",
|
||||||
message: t("timetickets.successes.created"),
|
message: t("timetickets.successes.created"),
|
||||||
});
|
});
|
||||||
|
form.resetFields();
|
||||||
toggleModalVisible();
|
toggleModalVisible();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -104,13 +106,13 @@ export function TimeTickeTaskModalContainer({
|
|||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (context.jobid) {
|
if (visible && context.jobid) {
|
||||||
console.log("UE Fired.");
|
|
||||||
queryJobInfo({ variables: { id: context.jobid } });
|
queryJobInfo({ variables: { id: context.jobid } });
|
||||||
}
|
}
|
||||||
}, [context.jobid, queryJobInfo]);
|
}, [context.jobid, queryJobInfo, visible]);
|
||||||
|
|
||||||
const calculateTimeTickets = (presetMemo) => {
|
const calculateTimeTickets = (presetMemo) => {
|
||||||
|
console.log("🚀 ~ file: time-ticket-task-modal.container.jsx:115 ~ calculateTimeTickets ~ presetMemo:", presetMemo)
|
||||||
const formData = form.getFieldsValue();
|
const formData = form.getFieldsValue();
|
||||||
if (
|
if (
|
||||||
!formData.jobid ||
|
!formData.jobid ||
|
||||||
@@ -122,14 +124,13 @@ export function TimeTickeTaskModalContainer({
|
|||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = [];
|
let data = [];
|
||||||
let eligibleHours = 0;
|
let eligibleHours = 0;
|
||||||
|
|
||||||
const theTeam = JSON.parse(formData.employeeteamid);
|
const theTeam = JSON.parse(formData.employeeteamid);
|
||||||
|
|
||||||
if (theTeam) {
|
if (theTeam) {
|
||||||
data = [];
|
|
||||||
|
|
||||||
formData.hourstype.forEach((hourstype) => {
|
formData.hourstype.forEach((hourstype) => {
|
||||||
eligibleHours =
|
eligibleHours =
|
||||||
lineTicketData.joblines.reduce(
|
lineTicketData.joblines.reduce(
|
||||||
@@ -148,6 +149,7 @@ export function TimeTickeTaskModalContainer({
|
|||||||
actualhrs: 0,
|
actualhrs: 0,
|
||||||
memo: presetMemo,
|
memo: presetMemo,
|
||||||
flat_rate: true,
|
flat_rate: true,
|
||||||
|
ciecacode: hourstype,
|
||||||
cost_center:
|
cost_center:
|
||||||
bodyshop.md_responsibility_centers.defaults.costs[hourstype],
|
bodyshop.md_responsibility_centers.defaults.costs[hourstype],
|
||||||
productivehrs:
|
productivehrs:
|
||||||
@@ -175,7 +177,10 @@ export function TimeTickeTaskModalContainer({
|
|||||||
<Modal
|
<Modal
|
||||||
destroyOnClose
|
destroyOnClose
|
||||||
open={visible}
|
open={visible}
|
||||||
onCancel={() => toggleModalVisible()}
|
onCancel={() => {
|
||||||
|
toggleModalVisible();
|
||||||
|
form.resetFields();
|
||||||
|
}}
|
||||||
width="80%"
|
width="80%"
|
||||||
onOk={() => form.submit()}
|
onOk={() => form.submit()}
|
||||||
>
|
>
|
||||||
@@ -184,7 +189,6 @@ export function TimeTickeTaskModalContainer({
|
|||||||
form={form}
|
form={form}
|
||||||
layout="vertical"
|
layout="vertical"
|
||||||
onFinish={handleFinish}
|
onFinish={handleFinish}
|
||||||
// onFieldsChange={handleFieldsChange}
|
|
||||||
initialValues={context}
|
initialValues={context}
|
||||||
>
|
>
|
||||||
<TimeTicketTaskModalComponent
|
<TimeTicketTaskModalComponent
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export default function TimeTicketsTasksPresets({
|
|||||||
percent: preset.percent,
|
percent: preset.percent,
|
||||||
hourstype: preset.hourstype,
|
hourstype: preset.hourstype,
|
||||||
});
|
});
|
||||||
|
|
||||||
calculateTimeTickets(preset.memo);
|
calculateTimeTickets(preset.memo);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { EditFilled } from "@ant-design/icons";
|
import { SyncOutlined, EditFilled } from "@ant-design/icons";
|
||||||
import { Button, Card, Space, Table, Tag } from "antd";
|
import { Button, Card, Space, Table, Tag } from "antd";
|
||||||
import Dinero from "dinero.js";
|
import Dinero from "dinero.js";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
@@ -210,6 +210,9 @@ export function TtApprovalsListComponent({
|
|||||||
completedCallback={setSelectedTickets}
|
completedCallback={setSelectedTickets}
|
||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
|
<Button onClick={() => refetch()}>
|
||||||
|
<SyncOutlined />
|
||||||
|
</Button>
|
||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -28,26 +28,29 @@ export function TimeTicketsContainer({
|
|||||||
const searchParams = queryString.parse(useLocation().search);
|
const searchParams = queryString.parse(useLocation().search);
|
||||||
const { page, sortcolumn, sortorder, search, searchObj } = searchParams;
|
const { page, sortcolumn, sortorder, search, searchObj } = searchParams;
|
||||||
|
|
||||||
const { loading, error, data } = useQuery(QUERY_ALL_TT_APPROVALS_PAGINATED, {
|
const { loading, error, data, refetch } = useQuery(
|
||||||
fetchPolicy: "network-only",
|
QUERY_ALL_TT_APPROVALS_PAGINATED,
|
||||||
nextFetchPolicy: "network-only",
|
{
|
||||||
variables: {
|
fetchPolicy: "network-only",
|
||||||
search: search || "",
|
nextFetchPolicy: "network-only",
|
||||||
offset: page ? (page - 1) * 25 : 0,
|
variables: {
|
||||||
limit: 25,
|
search: search || "",
|
||||||
order: [
|
offset: page ? (page - 1) * 25 : 0,
|
||||||
searchObj
|
limit: 25,
|
||||||
? JSON.parse(searchObj)
|
order: [
|
||||||
: {
|
searchObj
|
||||||
[sortcolumn || "date"]: sortorder
|
? JSON.parse(searchObj)
|
||||||
? sortorder === "descend"
|
: {
|
||||||
? "desc"
|
[sortcolumn || "date"]: sortorder
|
||||||
: "asc"
|
? sortorder === "descend"
|
||||||
: "desc",
|
? "desc"
|
||||||
},
|
: "asc"
|
||||||
],
|
: "desc",
|
||||||
},
|
},
|
||||||
});
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|
||||||
@@ -56,6 +59,7 @@ export function TimeTicketsContainer({
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
tt_approval_queue={data ? data.tt_approval_queue : []}
|
tt_approval_queue={data ? data.tt_approval_queue : []}
|
||||||
total={data ? data.tt_approval_queue_aggregate.aggregate.count : 0}
|
total={data ? data.tt_approval_queue_aggregate.aggregate.count : 0}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { useApolloClient } from "@apollo/client";
|
import { useApolloClient } from "@apollo/client";
|
||||||
import { Button } from "antd";
|
import { Button } from "antd";
|
||||||
|
import _ from "lodash";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import {
|
import { INSERT_TIME_TICKET_AND_APPROVE } from "../../graphql/timetickets.queries";
|
||||||
QUERY_TT_APPROVALS_BY_IDS,
|
import { QUERY_TT_APPROVALS_BY_IDS } from "../../graphql/tt-approvals.queries";
|
||||||
UPDATE_TT_BY_APPROVAL,
|
import moment from "moment";
|
||||||
} from "../../graphql/tt-approvals.queries";
|
|
||||||
import {
|
import {
|
||||||
selectBodyshop,
|
selectBodyshop,
|
||||||
selectCurrentUser,
|
selectCurrentUser,
|
||||||
@@ -38,13 +38,18 @@ export function TtApproveButton({
|
|||||||
variables: { ids: selectedTickets },
|
variables: { ids: selectedTickets },
|
||||||
});
|
});
|
||||||
|
|
||||||
const { data: insertData } = await client.query({
|
const { data: insertData } = await client.mutate({
|
||||||
query: UPDATE_TT_BY_APPROVAL,
|
mutation: INSERT_TIME_TICKET_AND_APPROVE,
|
||||||
variables: {
|
variables: {
|
||||||
ttApprovalUpdates: data.map((tta) => ({
|
timeTicketInput: data.tt_approval_queue.map((tta) => ({
|
||||||
_set: {},
|
..._.omit(tta, ["id", "__typename"]),
|
||||||
where: { id: { _eq: tta.id } },
|
ttapprovalqueueid: tta.id,
|
||||||
})),
|
})),
|
||||||
|
approvalIds: selectedTickets,
|
||||||
|
approvalUpdate: {
|
||||||
|
approved_at: moment(),
|
||||||
|
approved_by: currentUser.email,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ export const GET_LINE_TICKET_BY_PK = gql`
|
|||||||
op_code_desc
|
op_code_desc
|
||||||
convertedtolbr
|
convertedtolbr
|
||||||
convertedtolbr_data
|
convertedtolbr_data
|
||||||
|
|
||||||
}
|
}
|
||||||
timetickets(where: { jobid: { _eq: $id } }) {
|
timetickets(where: { jobid: { _eq: $id } }) {
|
||||||
actualhrs
|
actualhrs
|
||||||
@@ -65,6 +66,8 @@ export const GET_LINE_TICKET_BY_PK = gql`
|
|||||||
clockon
|
clockon
|
||||||
clockoff
|
clockoff
|
||||||
rate
|
rate
|
||||||
|
committed_at
|
||||||
|
committed_by
|
||||||
employee {
|
employee {
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
|
|||||||
@@ -83,6 +83,8 @@ export const QUERY_TIME_TICKETS_IN_RANGE_SB = gql`
|
|||||||
productivehrs
|
productivehrs
|
||||||
memo
|
memo
|
||||||
jobid
|
jobid
|
||||||
|
committed_at
|
||||||
|
committed_by
|
||||||
flat_rate
|
flat_rate
|
||||||
job {
|
job {
|
||||||
id
|
id
|
||||||
@@ -149,6 +151,39 @@ export const INSERT_NEW_TIME_TICKET = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const INSERT_TIME_TICKET_AND_APPROVE = gql`
|
||||||
|
mutation INSERT_TIME_TICKET_AND_APPROVE(
|
||||||
|
$timeTicketInput: [timetickets_insert_input!]!
|
||||||
|
$approvalIds: [uuid!]!
|
||||||
|
$approvalUpdate: tt_approval_queue_set_input
|
||||||
|
) {
|
||||||
|
insert_timetickets(objects: $timeTicketInput) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
clockon
|
||||||
|
clockoff
|
||||||
|
employeeid
|
||||||
|
productivehrs
|
||||||
|
actualhrs
|
||||||
|
ciecacode
|
||||||
|
date
|
||||||
|
memo
|
||||||
|
flat_rate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_tt_approval_queue(
|
||||||
|
where: { id: { _in: $approvalIds } }
|
||||||
|
_set: $approvalUpdate
|
||||||
|
) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
approved_at
|
||||||
|
approved_at
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
export const UPDATE_TIME_TICKET = gql`
|
export const UPDATE_TIME_TICKET = gql`
|
||||||
mutation UPDATE_TIME_TICKET(
|
mutation UPDATE_TIME_TICKET(
|
||||||
$timeticketId: uuid!
|
$timeticketId: uuid!
|
||||||
|
|||||||
@@ -6,7 +6,12 @@ export const QUERY_ALL_TT_APPROVALS_PAGINATED = gql`
|
|||||||
$limit: Int
|
$limit: Int
|
||||||
$order: [tt_approval_queue_order_by!]!
|
$order: [tt_approval_queue_order_by!]!
|
||||||
) {
|
) {
|
||||||
tt_approval_queue(offset: $offset, limit: $limit, order_by: $order) {
|
tt_approval_queue(
|
||||||
|
offset: $offset
|
||||||
|
limit: $limit
|
||||||
|
order_by: $order
|
||||||
|
where: { approved_at: { _is_null: true } }
|
||||||
|
) {
|
||||||
id
|
id
|
||||||
jobid
|
jobid
|
||||||
bodyshopid
|
bodyshopid
|
||||||
|
|||||||
@@ -435,6 +435,7 @@
|
|||||||
},
|
},
|
||||||
"timetickets": {
|
"timetickets": {
|
||||||
"edit": "Time Tickets -> Edit",
|
"edit": "Time Tickets -> Edit",
|
||||||
|
"editcommitted": "Time Tickets -> Edit Committed",
|
||||||
"enter": "Time Tickets -> Enter",
|
"enter": "Time Tickets -> Enter",
|
||||||
"list": "Time Tickets -> List",
|
"list": "Time Tickets -> List",
|
||||||
"shiftedit": "Time Tickets -> Shift Edit"
|
"shiftedit": "Time Tickets -> Shift Edit"
|
||||||
@@ -460,6 +461,8 @@
|
|||||||
"federal_tax": "Federal Tax",
|
"federal_tax": "Federal Tax",
|
||||||
"federal_tax_itc": "Federal Tax Credit",
|
"federal_tax_itc": "Federal Tax Credit",
|
||||||
"gst_override": "GST Override Account #",
|
"gst_override": "GST Override Account #",
|
||||||
|
"invoiceexemptcode": "",
|
||||||
|
"itemexemptcode": "",
|
||||||
"la1": "LA1",
|
"la1": "LA1",
|
||||||
"la2": "LA2",
|
"la2": "LA2",
|
||||||
"la3": "LA3",
|
"la3": "LA3",
|
||||||
@@ -1594,6 +1597,7 @@
|
|||||||
"scheddates": "Schedule Dates"
|
"scheddates": "Schedule Dates"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"act_price_ppc": "",
|
||||||
"actual_completion_inferred": "$t(jobs.fields.actual_completion) inferred using $t(jobs.fields.scheduled_completion).",
|
"actual_completion_inferred": "$t(jobs.fields.actual_completion) inferred using $t(jobs.fields.scheduled_completion).",
|
||||||
"actual_delivery_inferred": "$t(jobs.fields.actual_delivery) inferred using $t(jobs.fields.scheduled_delivery).",
|
"actual_delivery_inferred": "$t(jobs.fields.actual_delivery) inferred using $t(jobs.fields.scheduled_delivery).",
|
||||||
"actual_in_inferred": "$t(jobs.fields.actual_in) inferred using $t(jobs.fields.scheduled_in).",
|
"actual_in_inferred": "$t(jobs.fields.actual_in) inferred using $t(jobs.fields.scheduled_in).",
|
||||||
@@ -1730,6 +1734,7 @@
|
|||||||
"partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).<br/>\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.",
|
"partstotal": "This is the total of all parts and sublet amounts on the vehicle (some of these may require an in-house invoice).<br/>\nItems such as shop and paint materials, labor online lines, etc. are not included in this total.",
|
||||||
"totalreturns": "The total <b>retail</b> amount of returns created for this job."
|
"totalreturns": "The total <b>retail</b> amount of returns created for this job."
|
||||||
},
|
},
|
||||||
|
"ppc": "",
|
||||||
"profileadjustments": "",
|
"profileadjustments": "",
|
||||||
"prt_dsmk_total": "Line Item Adjustment",
|
"prt_dsmk_total": "Line Item Adjustment",
|
||||||
"rates": "Rates",
|
"rates": "Rates",
|
||||||
@@ -2648,10 +2653,12 @@
|
|||||||
"clockhours": "Clock Hours",
|
"clockhours": "Clock Hours",
|
||||||
"clockoff": "Clock Off",
|
"clockoff": "Clock Off",
|
||||||
"clockon": "Clocked In",
|
"clockon": "Clocked In",
|
||||||
|
"committed": "Committed",
|
||||||
"cost_center": "Cost Center",
|
"cost_center": "Cost Center",
|
||||||
"date": "Ticket Date",
|
"date": "Ticket Date",
|
||||||
"efficiency": "Efficiency",
|
"efficiency": "Efficiency",
|
||||||
"employee": "Employee",
|
"employee": "Employee",
|
||||||
|
"employee_team": "Employee Team",
|
||||||
"flat_rate": "Flat Rate?",
|
"flat_rate": "Flat Rate?",
|
||||||
"memo": "Memo",
|
"memo": "Memo",
|
||||||
"productivehrs": "Productive Hours",
|
"productivehrs": "Productive Hours",
|
||||||
@@ -2788,6 +2795,11 @@
|
|||||||
"vehicledetail": "Vehicle Details {{vehicle}} | $t(titles.app)",
|
"vehicledetail": "Vehicle Details {{vehicle}} | $t(titles.app)",
|
||||||
"vehicles": "All Vehicles | $t(titles.app)"
|
"vehicles": "All Vehicles | $t(titles.app)"
|
||||||
},
|
},
|
||||||
|
"tt_approvals": {
|
||||||
|
"actions": {
|
||||||
|
"approveselected": "Approve Selected"
|
||||||
|
}
|
||||||
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "Change Password",
|
"changepassword": "Change Password",
|
||||||
|
|||||||
@@ -435,6 +435,7 @@
|
|||||||
},
|
},
|
||||||
"timetickets": {
|
"timetickets": {
|
||||||
"edit": "",
|
"edit": "",
|
||||||
|
"editcommitted": "",
|
||||||
"enter": "",
|
"enter": "",
|
||||||
"list": "",
|
"list": "",
|
||||||
"shiftedit": ""
|
"shiftedit": ""
|
||||||
@@ -460,6 +461,8 @@
|
|||||||
"federal_tax": "",
|
"federal_tax": "",
|
||||||
"federal_tax_itc": "",
|
"federal_tax_itc": "",
|
||||||
"gst_override": "",
|
"gst_override": "",
|
||||||
|
"invoiceexemptcode": "",
|
||||||
|
"itemexemptcode": "",
|
||||||
"la1": "",
|
"la1": "",
|
||||||
"la2": "",
|
"la2": "",
|
||||||
"la3": "",
|
"la3": "",
|
||||||
@@ -1594,6 +1597,7 @@
|
|||||||
"scheddates": ""
|
"scheddates": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"act_price_ppc": "",
|
||||||
"actual_completion_inferred": "",
|
"actual_completion_inferred": "",
|
||||||
"actual_delivery_inferred": "",
|
"actual_delivery_inferred": "",
|
||||||
"actual_in_inferred": "",
|
"actual_in_inferred": "",
|
||||||
@@ -1730,6 +1734,7 @@
|
|||||||
"partstotal": "",
|
"partstotal": "",
|
||||||
"totalreturns": ""
|
"totalreturns": ""
|
||||||
},
|
},
|
||||||
|
"ppc": "",
|
||||||
"profileadjustments": "",
|
"profileadjustments": "",
|
||||||
"prt_dsmk_total": "",
|
"prt_dsmk_total": "",
|
||||||
"rates": "Tarifas",
|
"rates": "Tarifas",
|
||||||
@@ -2648,10 +2653,12 @@
|
|||||||
"clockhours": "",
|
"clockhours": "",
|
||||||
"clockoff": "",
|
"clockoff": "",
|
||||||
"clockon": "",
|
"clockon": "",
|
||||||
|
"committed": "",
|
||||||
"cost_center": "",
|
"cost_center": "",
|
||||||
"date": "",
|
"date": "",
|
||||||
"efficiency": "",
|
"efficiency": "",
|
||||||
"employee": "",
|
"employee": "",
|
||||||
|
"employee_team": "",
|
||||||
"flat_rate": "",
|
"flat_rate": "",
|
||||||
"memo": "",
|
"memo": "",
|
||||||
"productivehrs": "",
|
"productivehrs": "",
|
||||||
@@ -2788,6 +2795,11 @@
|
|||||||
"vehicledetail": "Detalles del vehículo {{vehicle}} | $t(titles.app)",
|
"vehicledetail": "Detalles del vehículo {{vehicle}} | $t(titles.app)",
|
||||||
"vehicles": "Todos los vehiculos | $t(titles.app)"
|
"vehicles": "Todos los vehiculos | $t(titles.app)"
|
||||||
},
|
},
|
||||||
|
"tt_approvals": {
|
||||||
|
"actions": {
|
||||||
|
"approveselected": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
|
|||||||
@@ -435,6 +435,7 @@
|
|||||||
},
|
},
|
||||||
"timetickets": {
|
"timetickets": {
|
||||||
"edit": "",
|
"edit": "",
|
||||||
|
"editcommitted": "",
|
||||||
"enter": "",
|
"enter": "",
|
||||||
"list": "",
|
"list": "",
|
||||||
"shiftedit": ""
|
"shiftedit": ""
|
||||||
@@ -460,6 +461,8 @@
|
|||||||
"federal_tax": "",
|
"federal_tax": "",
|
||||||
"federal_tax_itc": "",
|
"federal_tax_itc": "",
|
||||||
"gst_override": "",
|
"gst_override": "",
|
||||||
|
"invoiceexemptcode": "",
|
||||||
|
"itemexemptcode": "",
|
||||||
"la1": "",
|
"la1": "",
|
||||||
"la2": "",
|
"la2": "",
|
||||||
"la3": "",
|
"la3": "",
|
||||||
@@ -1594,6 +1597,7 @@
|
|||||||
"scheddates": ""
|
"scheddates": ""
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"act_price_ppc": "",
|
||||||
"actual_completion_inferred": "",
|
"actual_completion_inferred": "",
|
||||||
"actual_delivery_inferred": "",
|
"actual_delivery_inferred": "",
|
||||||
"actual_in_inferred": "",
|
"actual_in_inferred": "",
|
||||||
@@ -1730,6 +1734,7 @@
|
|||||||
"partstotal": "",
|
"partstotal": "",
|
||||||
"totalreturns": ""
|
"totalreturns": ""
|
||||||
},
|
},
|
||||||
|
"ppc": "",
|
||||||
"profileadjustments": "",
|
"profileadjustments": "",
|
||||||
"prt_dsmk_total": "",
|
"prt_dsmk_total": "",
|
||||||
"rates": "Les taux",
|
"rates": "Les taux",
|
||||||
@@ -2648,10 +2653,12 @@
|
|||||||
"clockhours": "",
|
"clockhours": "",
|
||||||
"clockoff": "",
|
"clockoff": "",
|
||||||
"clockon": "",
|
"clockon": "",
|
||||||
|
"committed": "",
|
||||||
"cost_center": "",
|
"cost_center": "",
|
||||||
"date": "",
|
"date": "",
|
||||||
"efficiency": "",
|
"efficiency": "",
|
||||||
"employee": "",
|
"employee": "",
|
||||||
|
"employee_team": "",
|
||||||
"flat_rate": "",
|
"flat_rate": "",
|
||||||
"memo": "",
|
"memo": "",
|
||||||
"productivehrs": "",
|
"productivehrs": "",
|
||||||
@@ -2788,6 +2795,11 @@
|
|||||||
"vehicledetail": "Détails du véhicule {{vehicle} | $t(titles.app)",
|
"vehicledetail": "Détails du véhicule {{vehicle} | $t(titles.app)",
|
||||||
"vehicles": "Tous les véhicules | $t(titles.app)"
|
"vehicles": "Tous les véhicules | $t(titles.app)"
|
||||||
},
|
},
|
||||||
|
"tt_approvals": {
|
||||||
|
"actions": {
|
||||||
|
"approveselected": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"actions": {
|
"actions": {
|
||||||
"changepassword": "",
|
"changepassword": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user