diff --git a/client/src/components/bill-form/bill-form.component.jsx b/client/src/components/bill-form/bill-form.component.jsx
index 3ff123743..0fa28359a 100644
--- a/client/src/components/bill-form/bill-form.component.jsx
+++ b/client/src/components/bill-form/bill-form.component.jsx
@@ -1,6 +1,6 @@
import Icon, { UploadOutlined } from "@ant-design/icons";
import { useApolloClient } from "@apollo/client";
-import { MdOpenInNew } from "react-icons/md";
+import { useTreatments } from "@splitsoftware/splitio-react";
import {
Alert,
Divider,
@@ -12,14 +12,17 @@ import {
Switch,
Upload,
} from "antd";
+import moment from "moment";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
+import { MdOpenInNew } from "react-icons/md";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { CHECK_BILL_INVOICE_NUMBER } from "../../graphql/bills.queries";
import { selectBodyshop } from "../../redux/user/user.selectors";
import AlertComponent from "../alert/alert.component";
+import BillFormLinesExtended from "../bill-form-lines-extended/bill-form-lines-extended.component";
import FormDatePicker from "../form-date-picker/form-date-picker.component";
import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
@@ -28,8 +31,6 @@ import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component";
import BillFormLines from "./bill-form.lines.component";
import { CalculateBillTotal } from "./bill-form.totals.utility";
-import { useTreatments } from "@splitsoftware/splitio-react";
-import BillFormLinesExtended from "../bill-form-lines-extended/bill-form-lines-extended.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -58,6 +59,11 @@ export function BillFormComponent({
{},
bodyshop.imexshopid
);
+ const { ClosingPeriod } = useTreatments(
+ ["ClosingPeriod"],
+ {},
+ bodyshop.imexshopid
+ );
const handleVendorSelect = (props, opt) => {
setDiscount(opt.discount);
@@ -259,6 +265,37 @@ export function BillFormComponent({
required: true,
//message: t("general.validation.required"),
},
+ ({ getFieldValue }) => ({
+ validator(rule, value) {
+ if (
+ ClosingPeriod.treatment === "on" &&
+ bodyshop.accountingconfig.ClosingPeriod
+ ) {
+ if (
+ moment(value)
+ .startOf("day")
+ .isSameOrAfter(
+ moment(
+ bodyshop.accountingconfig.ClosingPeriod[0]
+ ).startOf("day")
+ ) &&
+ moment(value)
+ .startOf("day")
+ .isSameOrBefore(
+ moment(
+ bodyshop.accountingconfig.ClosingPeriod[1]
+ ).endOf("day")
+ )
+ ) {
+ return Promise.resolve();
+ } else {
+ return Promise.reject(t("bills.validation.closingperiod"));
+ }
+ } else {
+ return Promise.resolve();
+ }
+ },
+ }),
]}
>
diff --git a/client/src/components/shop-info/shop-info.container.jsx b/client/src/components/shop-info/shop-info.container.jsx
index fec10877c..dd254a4cb 100644
--- a/client/src/components/shop-info/shop-info.container.jsx
+++ b/client/src/components/shop-info/shop-info.container.jsx
@@ -1,14 +1,14 @@
-import React, { useEffect, useState } from "react";
-import ShopInfoComponent from "./shop-info.component";
+import { useMutation, useQuery } from "@apollo/client";
import { Form, notification } from "antd";
-import { useQuery, useMutation } from "@apollo/client";
-import { QUERY_BODYSHOP, UPDATE_SHOP } from "../../graphql/bodyshop.queries";
-import LoadingSpinner from "../loading-spinner/loading-spinner.component";
-import AlertComponent from "../alert/alert.component";
+import moment from "moment";
+import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { logImEXEvent } from "../../firebase/firebase.utils";
+import { QUERY_BODYSHOP, UPDATE_SHOP } from "../../graphql/bodyshop.queries";
+import AlertComponent from "../alert/alert.component";
import FormsFieldChanged from "../form-fields-changed-alert/form-fields-changed-alert.component";
-import moment from "moment";
+import LoadingSpinner from "../loading-spinner/loading-spinner.component";
+import ShopInfoComponent from "./shop-info.component";
export default function ShopInfoContainer() {
const [form] = Form.useForm();
const { t } = useTranslation();
@@ -52,13 +52,28 @@ export default function ShopInfoContainer() {
onFinish={handleFinish}
initialValues={
data
- ? {
- ...data.bodyshops[0],
- schedule_start_time: moment(
- data.bodyshops[0].schedule_start_time
- ),
- schedule_end_time: moment(data.bodyshops[0].schedule_end_time),
- }
+ ? data.bodyshops[0].accountingconfig.ClosingPeriod
+ ? {
+ ...data.bodyshops[0],
+ accountingconfig: {
+ ...data.bodyshops[0].accountingconfig,
+ ClosingPeriod: [
+ moment(data.bodyshops[0].accountingconfig.ClosingPeriod[0]),
+ moment(data.bodyshops[0].accountingconfig.ClosingPeriod[1]),
+ ],
+ },
+ schedule_start_time: moment(
+ data.bodyshops[0].schedule_start_time
+ ),
+ schedule_end_time: moment(data.bodyshops[0].schedule_end_time),
+ }
+ : {
+ ...data.bodyshops[0],
+ schedule_start_time: moment(
+ data.bodyshops[0].schedule_start_time
+ ),
+ schedule_end_time: moment(data.bodyshops[0].schedule_end_time),
+ }
: null
}
>
diff --git a/client/src/components/shop-info/shop-info.general.component.jsx b/client/src/components/shop-info/shop-info.general.component.jsx
index 99245c76e..ebf2accaf 100644
--- a/client/src/components/shop-info/shop-info.general.component.jsx
+++ b/client/src/components/shop-info/shop-info.general.component.jsx
@@ -1,6 +1,8 @@
import { DeleteFilled } from "@ant-design/icons";
+import { useTreatments } from "@splitsoftware/splitio-react";
import {
Button,
+ DatePicker,
Form,
Input,
InputNumber,
@@ -9,8 +11,13 @@ import {
Space,
Switch,
} from "antd";
+import momentTZ from "moment-timezone";
import React from "react";
import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+import DatePickerRanges from "../../utils/DatePickerRanges";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
import FormItemEmail from "../form-items-formatted/email-form-item.component";
import PhoneFormItem, {
@@ -18,12 +25,22 @@ import PhoneFormItem, {
} from "../form-items-formatted/phone-form-item.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
-
-import momentTZ from "moment-timezone";
const timeZonesList = momentTZ.tz.names();
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+const mapDispatchToProps = (dispatch) => ({
+ //setUserLanguage: language => dispatch(setUserLanguage(language))
+});
+export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoGeneral);
-export default function ShopInfoGeneral({ form }) {
+export function ShopInfoGeneral({ form, bodyshop }) {
const { t } = useTranslation();
+ const { ClosingPeriod } = useTreatments(
+ ["ClosingPeriod"],
+ {},
+ bodyshop && bodyshop.imexshopid
+ );
return (
@@ -392,6 +409,20 @@ export default function ShopInfoGeneral({ form }) {
>
+ {ClosingPeriod.treatment === "on" && (
+ <>
+
+
+
+ >
+ )}
{
setLoading(true);
@@ -254,12 +259,40 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
if (!value || moment(value).isSameOrAfter(moment(), "day")) {
return Promise.resolve();
}
-
return Promise.reject(
new Error(t("jobs.labels.dms.invoicedatefuture"))
);
},
}),
+ ({ getFieldValue }) => ({
+ validator(_, value) {
+ if (
+ ClosingPeriod.treatment === "on" &&
+ bodyshop.accountingconfig.ClosingPeriod
+ ) {
+ if (
+ moment(value).isSameOrAfter(
+ moment(
+ bodyshop.accountingconfig.ClosingPeriod[0]
+ ).startOf("day")
+ ) &&
+ moment(value).isSameOrBefore(
+ moment(
+ bodyshop.accountingconfig.ClosingPeriod[1]
+ ).endOf("day")
+ )
+ ) {
+ return Promise.resolve();
+ } else {
+ return Promise.reject(
+ new Error(t("jobs.labels.closingperiod"))
+ );
+ }
+ } else {
+ return Promise.resolve();
+ }
+ },
+ }),
]}
>
{
},
group: "payroll",
},
+ work_in_progress_jobs_excel: {
+ title: i18n.t("reportcenter.templates.work_in_progress_jobs"),
+ subject: i18n.t("reportcenter.templates.work_in_progress_jobs"),
+ key: "work_in_progress_jobs_excel",
+ //idtype: "vendor",
+ reporttype: "excel",
+ disabled: false,
+ rangeFilter: {
+ object: i18n.t("reportcenter.labels.objects.jobs"),
+ field: i18n.t("jobs.fields.date_open"),
+ },
+ group: "jobs",
+ },
work_in_progress_labour: {
title: i18n.t("reportcenter.templates.work_in_progress_labour"),
description: "",