IO-1855 Change QBO changes to server side.
This commit is contained in:
@@ -28,7 +28,7 @@ export default connect(
|
|||||||
mapDispatchToProps
|
mapDispatchToProps
|
||||||
)(AccountingPayablesTableComponent);
|
)(AccountingPayablesTableComponent);
|
||||||
|
|
||||||
export function AccountingPayablesTableComponent({ bodyshop, loading, bills }) {
|
export function AccountingPayablesTableComponent({ bodyshop, loading, bills, refetch }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [selectedBills, setSelectedBills] = useState([]);
|
const [selectedBills, setSelectedBills] = useState([]);
|
||||||
const [transInProgress, setTransInProgress] = useState(false);
|
const [transInProgress, setTransInProgress] = useState(false);
|
||||||
@@ -149,6 +149,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills }) {
|
|||||||
disabled={transInProgress || !!record.exported}
|
disabled={transInProgress || !!record.exported}
|
||||||
loadingCallback={setTransInProgress}
|
loadingCallback={setTransInProgress}
|
||||||
setSelectedBills={setSelectedBills}
|
setSelectedBills={setSelectedBills}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
@@ -181,6 +182,7 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills }) {
|
|||||||
disabled={transInProgress || selectedBills.length === 0}
|
disabled={transInProgress || selectedBills.length === 0}
|
||||||
loadingCallback={setTransInProgress}
|
loadingCallback={setTransInProgress}
|
||||||
completedCallback={setSelectedBills}
|
completedCallback={setSelectedBills}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
||||||
<QboAuthorizeComponent />
|
<QboAuthorizeComponent />
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ export function AccountingPayablesTableComponent({
|
|||||||
bodyshop,
|
bodyshop,
|
||||||
loading,
|
loading,
|
||||||
payments,
|
payments,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [selectedPayments, setSelectedPayments] = useState([]);
|
const [selectedPayments, setSelectedPayments] = useState([]);
|
||||||
@@ -147,6 +148,7 @@ export function AccountingPayablesTableComponent({
|
|||||||
disabled={transInProgress || !!record.exportedat}
|
disabled={transInProgress || !!record.exportedat}
|
||||||
loadingCallback={setTransInProgress}
|
loadingCallback={setTransInProgress}
|
||||||
setSelectedPayments={setSelectedPayments}
|
setSelectedPayments={setSelectedPayments}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@@ -187,6 +189,7 @@ export function AccountingPayablesTableComponent({
|
|||||||
disabled={transInProgress || selectedPayments.length === 0}
|
disabled={transInProgress || selectedPayments.length === 0}
|
||||||
loadingCallback={setTransInProgress}
|
loadingCallback={setTransInProgress}
|
||||||
completedCallback={setSelectedPayments}
|
completedCallback={setSelectedPayments}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
||||||
<QboAuthorizeComponent />
|
<QboAuthorizeComponent />
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ export function AccountingReceivablesTableComponent({
|
|||||||
bodyshop,
|
bodyshop,
|
||||||
loading,
|
loading,
|
||||||
jobs,
|
jobs,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [selectedJobs, setSelectedJobs] = useState([]);
|
const [selectedJobs, setSelectedJobs] = useState([]);
|
||||||
@@ -155,6 +156,7 @@ export function AccountingReceivablesTableComponent({
|
|||||||
jobId={record.id}
|
jobId={record.id}
|
||||||
disabled={!!record.date_exported}
|
disabled={!!record.date_exported}
|
||||||
setSelectedJobs={setSelectedJobs}
|
setSelectedJobs={setSelectedJobs}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
<Link to={`/manage/jobs/${record.id}/close`}>
|
<Link to={`/manage/jobs/${record.id}/close`}>
|
||||||
<Button>{t("jobs.labels.viewallocations")}</Button>
|
<Button>{t("jobs.labels.viewallocations")}</Button>
|
||||||
@@ -205,6 +207,7 @@ export function AccountingReceivablesTableComponent({
|
|||||||
disabled={transInProgress || selectedJobs.length === 0}
|
disabled={transInProgress || selectedJobs.length === 0}
|
||||||
loadingCallback={setTransInProgress}
|
loadingCallback={setTransInProgress}
|
||||||
completedCallback={setSelectedJobs}
|
completedCallback={setSelectedJobs}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
{bodyshop.accountingconfig && bodyshop.accountingconfig.qbo && (
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import { logImEXEvent } from "../../firebase/firebase.utils";
|
|||||||
import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries";
|
import { INSERT_EXPORT_LOG } from "../../graphql/accounting.queries";
|
||||||
import { useHistory } from "react-router-dom";
|
import { useHistory } from "react-router-dom";
|
||||||
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
@@ -27,6 +26,7 @@ export function JobsCloseExportButton({
|
|||||||
jobId,
|
jobId,
|
||||||
disabled,
|
disabled,
|
||||||
setSelectedJobs,
|
setSelectedJobs,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -46,13 +46,9 @@ export function JobsCloseExportButton({
|
|||||||
//Check if it's a QBO Setup.
|
//Check if it's a QBO Setup.
|
||||||
let PartnerResponse;
|
let PartnerResponse;
|
||||||
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) {
|
||||||
PartnerResponse = await axios.post(
|
PartnerResponse = await axios.post(`/qbo/receivables`, {
|
||||||
`/qbo/receivables`,
|
jobIds: [jobId],
|
||||||
{
|
});
|
||||||
jobIds: [jobId],
|
|
||||||
},
|
|
||||||
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
//Default is QBD
|
//Default is QBD
|
||||||
|
|
||||||
@@ -117,58 +113,64 @@ export function JobsCloseExportButton({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
await insertExportLog({
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
variables: {
|
//QBO Logs are handled server side.
|
||||||
logs: [
|
await insertExportLog({
|
||||||
{
|
variables: {
|
||||||
bodyshopid: bodyshop.id,
|
logs: [
|
||||||
jobid: jobId,
|
{
|
||||||
successful: false,
|
bodyshopid: bodyshop.id,
|
||||||
message: JSON.stringify(
|
jobid: jobId,
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
successful: false,
|
||||||
),
|
message: JSON.stringify(
|
||||||
useremail: currentUser.email,
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
},
|
),
|
||||||
],
|
useremail: currentUser.email,
|
||||||
},
|
},
|
||||||
});
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
//Insert success export log.
|
//Insert success export log.
|
||||||
await insertExportLog({
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
variables: {
|
//QBO Logs are handled server side.
|
||||||
logs: [
|
await insertExportLog({
|
||||||
{
|
variables: {
|
||||||
bodyshopid: bodyshop.id,
|
logs: [
|
||||||
jobid: jobId,
|
{
|
||||||
successful: true,
|
bodyshopid: bodyshop.id,
|
||||||
useremail: currentUser.email,
|
jobid: jobId,
|
||||||
},
|
successful: true,
|
||||||
],
|
useremail: currentUser.email,
|
||||||
},
|
},
|
||||||
});
|
],
|
||||||
|
|
||||||
const jobUpdateResponse = await updateJob({
|
|
||||||
variables: {
|
|
||||||
jobId: jobId,
|
|
||||||
job: {
|
|
||||||
status: bodyshop.md_ro_statuses.default_exported || "Exported*",
|
|
||||||
date_exported: new Date(),
|
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
|
||||||
|
|
||||||
if (!jobUpdateResponse.errors) {
|
const jobUpdateResponse = await updateJob({
|
||||||
notification.open({
|
variables: {
|
||||||
type: "success",
|
jobId: jobId,
|
||||||
key: "jobsuccessexport",
|
job: {
|
||||||
message: t("jobs.successes.exported"),
|
status: bodyshop.md_ro_statuses.default_exported || "Exported*",
|
||||||
});
|
date_exported: new Date(),
|
||||||
} else {
|
},
|
||||||
notification["error"]({
|
},
|
||||||
message: t("jobs.errors.exporting", {
|
|
||||||
error: JSON.stringify(jobUpdateResponse.error),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!jobUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "jobsuccessexport",
|
||||||
|
message: t("jobs.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("jobs.errors.exporting", {
|
||||||
|
error: JSON.stringify(jobUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (setSelectedJobs) {
|
if (setSelectedJobs) {
|
||||||
setSelectedJobs((selectedJobs) => {
|
setSelectedJobs((selectedJobs) => {
|
||||||
@@ -176,7 +178,7 @@ export function JobsCloseExportButton({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export function JobsExportAllButton({
|
|||||||
disabled,
|
disabled,
|
||||||
loadingCallback,
|
loadingCallback,
|
||||||
completedCallback,
|
completedCallback,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updateJob] = useMutation(UPDATE_JOBS);
|
const [updateJob] = useMutation(UPDATE_JOBS);
|
||||||
@@ -83,6 +84,7 @@ export function JobsExportAllButton({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("PartnerResponse", PartnerResponse);
|
console.log("PartnerResponse", PartnerResponse);
|
||||||
const groupedData = _.groupBy(
|
const groupedData = _.groupBy(
|
||||||
PartnerResponse.data,
|
PartnerResponse.data,
|
||||||
@@ -106,61 +108,70 @@ export function JobsExportAllButton({
|
|||||||
});
|
});
|
||||||
//Call is not awaited as it is not critical to finish before proceeding.
|
//Call is not awaited as it is not critical to finish before proceeding.
|
||||||
});
|
});
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
jobid: key,
|
|
||||||
successful: false,
|
|
||||||
message: JSON.stringify(
|
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
|
||||||
),
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
jobid: key,
|
|
||||||
successful: true,
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const jobUpdateResponse = await updateJob({
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
variables: {
|
//QBO Logs are handled server side.
|
||||||
jobIds: [key],
|
await insertExportLog({
|
||||||
fields: {
|
variables: {
|
||||||
status: bodyshop.md_ro_statuses.default_exported || "Exported*",
|
logs: [
|
||||||
date_exported: new Date(),
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
jobid: key,
|
||||||
|
successful: false,
|
||||||
|
message: JSON.stringify(
|
||||||
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
|
),
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
});
|
}
|
||||||
|
} else {
|
||||||
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
|
//QBO Logs are handled server side.
|
||||||
|
await insertExportLog({
|
||||||
|
variables: {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
jobid: key,
|
||||||
|
successful: true,
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
if (!jobUpdateResponse.errors) {
|
const jobUpdateResponse = await updateJob({
|
||||||
notification.open({
|
variables: {
|
||||||
type: "success",
|
jobIds: [key],
|
||||||
key: "jobsuccessexport",
|
fields: {
|
||||||
message: t("jobs.successes.exported"),
|
status:
|
||||||
});
|
bodyshop.md_ro_statuses.default_exported || "Exported*",
|
||||||
} else {
|
date_exported: new Date(),
|
||||||
notification["error"]({
|
},
|
||||||
message: t("jobs.errors.exporting", {
|
},
|
||||||
error: JSON.stringify(jobUpdateResponse.error),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!jobUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "jobsuccessexport",
|
||||||
|
message: t("jobs.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("jobs.errors.exporting", {
|
||||||
|
error: JSON.stringify(jobUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
|
|
||||||
if (!!completedCallback) completedCallback([]);
|
if (!!completedCallback) completedCallback([]);
|
||||||
if (!!loadingCallback) loadingCallback(false);
|
if (!!loadingCallback) loadingCallback(false);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export function PayableExportAll({
|
|||||||
disabled,
|
disabled,
|
||||||
loadingCallback,
|
loadingCallback,
|
||||||
completedCallback,
|
completedCallback,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updateBill] = useMutation(UPDATE_BILLS);
|
const [updateBill] = useMutation(UPDATE_BILLS);
|
||||||
@@ -104,57 +105,62 @@ export function PayableExportAll({
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
await insertExportLog({
|
//QBO Logs are handled server side.
|
||||||
variables: {
|
await insertExportLog({
|
||||||
logs: [
|
variables: {
|
||||||
{
|
logs: [
|
||||||
bodyshopid: bodyshop.id,
|
{
|
||||||
billid: key,
|
bodyshopid: bodyshop.id,
|
||||||
successful: false,
|
billid: key,
|
||||||
message: JSON.stringify(
|
successful: false,
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
message: JSON.stringify(
|
||||||
),
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
useremail: currentUser.email,
|
),
|
||||||
},
|
useremail: currentUser.email,
|
||||||
],
|
},
|
||||||
},
|
],
|
||||||
});
|
|
||||||
} else {
|
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
billid: key,
|
|
||||||
successful: true,
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const billUpdateResponse = await updateBill({
|
|
||||||
variables: {
|
|
||||||
billIdList: [key],
|
|
||||||
bill: {
|
|
||||||
exported: true,
|
|
||||||
exported_at: new Date(),
|
|
||||||
},
|
},
|
||||||
},
|
|
||||||
});
|
|
||||||
if (!!!billUpdateResponse.errors) {
|
|
||||||
notification.open({
|
|
||||||
type: "success",
|
|
||||||
key: "billsuccessexport",
|
|
||||||
message: t("bills.successes.exported"),
|
|
||||||
});
|
});
|
||||||
} else {
|
}
|
||||||
notification["error"]({
|
} else {
|
||||||
message: t("bills.errors.exporting", {
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
error: JSON.stringify(billUpdateResponse.error),
|
//QBO Logs are handled server side.
|
||||||
}),
|
await insertExportLog({
|
||||||
|
variables: {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
billid: key,
|
||||||
|
successful: true,
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const billUpdateResponse = await updateBill({
|
||||||
|
variables: {
|
||||||
|
billIdList: [key],
|
||||||
|
bill: {
|
||||||
|
exported: true,
|
||||||
|
exported_at: new Date(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!!!billUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "billsuccessexport",
|
||||||
|
message: t("bills.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("bills.errors.exporting", {
|
||||||
|
error: JSON.stringify(billUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})()
|
})()
|
||||||
@@ -164,6 +170,8 @@ export function PayableExportAll({
|
|||||||
await Promise.all(proms);
|
await Promise.all(proms);
|
||||||
if (!!completedCallback) completedCallback([]);
|
if (!!completedCallback) completedCallback([]);
|
||||||
if (!!loadingCallback) loadingCallback(false);
|
if (!!loadingCallback) loadingCallback(false);
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export function PayableExportButton({
|
|||||||
disabled,
|
disabled,
|
||||||
loadingCallback,
|
loadingCallback,
|
||||||
setSelectedBills,
|
setSelectedBills,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updateBill] = useMutation(UPDATE_BILLS);
|
const [updateBill] = useMutation(UPDATE_BILLS);
|
||||||
@@ -100,64 +101,72 @@ export function PayableExportButton({
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
await insertExportLog({
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
variables: {
|
//QBO Logs are handled server side.
|
||||||
logs: [
|
await insertExportLog({
|
||||||
{
|
variables: {
|
||||||
bodyshopid: bodyshop.id,
|
logs: [
|
||||||
billid: billId,
|
{
|
||||||
successful: false,
|
bodyshopid: bodyshop.id,
|
||||||
message: JSON.stringify(
|
billid: billId,
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
successful: false,
|
||||||
),
|
message: JSON.stringify(
|
||||||
useremail: currentUser.email,
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
},
|
),
|
||||||
],
|
useremail: currentUser.email,
|
||||||
},
|
},
|
||||||
});
|
],
|
||||||
}
|
|
||||||
if (successfulTransactions.length > 0) {
|
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
billid: billId,
|
|
||||||
successful: true,
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const billUpdateResponse = await updateBill({
|
|
||||||
variables: {
|
|
||||||
billIdList: successfulTransactions.map(
|
|
||||||
(st) =>
|
|
||||||
st[
|
|
||||||
bodyshop.accountingconfig && bodyshop.accountingconfig.qbo
|
|
||||||
? "billid"
|
|
||||||
: "id"
|
|
||||||
]
|
|
||||||
),
|
|
||||||
bill: {
|
|
||||||
exported: true,
|
|
||||||
exported_at: new Date(),
|
|
||||||
},
|
},
|
||||||
},
|
|
||||||
});
|
|
||||||
if (!!!billUpdateResponse.errors) {
|
|
||||||
notification.open({
|
|
||||||
type: "success",
|
|
||||||
key: "billsuccessexport",
|
|
||||||
message: t("bills.successes.exported"),
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
notification["error"]({
|
|
||||||
message: t("bills.errors.exporting", {
|
|
||||||
error: JSON.stringify(billUpdateResponse.error),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (successfulTransactions.length > 0) {
|
||||||
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
|
//QBO Logs are handled server side.
|
||||||
|
await insertExportLog({
|
||||||
|
variables: {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
billid: billId,
|
||||||
|
successful: true,
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const billUpdateResponse = await updateBill({
|
||||||
|
variables: {
|
||||||
|
billIdList: successfulTransactions.map(
|
||||||
|
(st) =>
|
||||||
|
st[
|
||||||
|
bodyshop.accountingconfig && bodyshop.accountingconfig.qbo
|
||||||
|
? "billid"
|
||||||
|
: "id"
|
||||||
|
]
|
||||||
|
),
|
||||||
|
bill: {
|
||||||
|
exported: true,
|
||||||
|
exported_at: new Date(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!!!billUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "billsuccessexport",
|
||||||
|
message: t("bills.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("bills.errors.exporting", {
|
||||||
|
error: JSON.stringify(billUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
|
|
||||||
if (setSelectedBills) {
|
if (setSelectedBills) {
|
||||||
setSelectedBills((selectedBills) => {
|
setSelectedBills((selectedBills) => {
|
||||||
return selectedBills.filter((i) => i !== billId);
|
return selectedBills.filter((i) => i !== billId);
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export function PaymentExportButton({
|
|||||||
disabled,
|
disabled,
|
||||||
loadingCallback,
|
loadingCallback,
|
||||||
setSelectedPayments,
|
setSelectedPayments,
|
||||||
|
refetch,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updatePayment] = useMutation(UPDATE_PAYMENTS);
|
const [updatePayment] = useMutation(UPDATE_PAYMENTS);
|
||||||
@@ -100,63 +101,68 @@ export function PaymentExportButton({
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
await insertExportLog({
|
//QBO Logs are handled server side.
|
||||||
variables: {
|
await insertExportLog({
|
||||||
logs: [
|
variables: {
|
||||||
{
|
logs: [
|
||||||
bodyshopid: bodyshop.id,
|
{
|
||||||
paymentid: paymentId,
|
bodyshopid: bodyshop.id,
|
||||||
successful: false,
|
paymentid: paymentId,
|
||||||
message: JSON.stringify(
|
successful: false,
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
message: JSON.stringify(
|
||||||
),
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
useremail: currentUser.email,
|
),
|
||||||
},
|
useremail: currentUser.email,
|
||||||
],
|
},
|
||||||
},
|
],
|
||||||
});
|
|
||||||
} else {
|
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
paymentid: paymentId,
|
|
||||||
successful: true,
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const paymentUpdateResponse = await updatePayment({
|
|
||||||
variables: {
|
|
||||||
paymentIdList: successfulTransactions.map(
|
|
||||||
(st) =>
|
|
||||||
st[
|
|
||||||
bodyshop.accountingconfig && bodyshop.accountingconfig.qbo
|
|
||||||
? "paymentid"
|
|
||||||
: "id"
|
|
||||||
]
|
|
||||||
),
|
|
||||||
payment: {
|
|
||||||
exportedat: new Date(),
|
|
||||||
},
|
},
|
||||||
},
|
|
||||||
});
|
|
||||||
if (!!!paymentUpdateResponse.errors) {
|
|
||||||
notification.open({
|
|
||||||
type: "success",
|
|
||||||
key: "paymentsuccessexport",
|
|
||||||
message: t("payments.successes.exported"),
|
|
||||||
});
|
});
|
||||||
} else {
|
}
|
||||||
notification["error"]({
|
} else {
|
||||||
message: t("payments.errors.exporting", {
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
error: JSON.stringify(paymentUpdateResponse.error),
|
//QBO Logs are handled server side.
|
||||||
}),
|
await insertExportLog({
|
||||||
|
variables: {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
paymentid: paymentId,
|
||||||
|
successful: true,
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const paymentUpdateResponse = await updatePayment({
|
||||||
|
variables: {
|
||||||
|
paymentIdList: successfulTransactions.map(
|
||||||
|
(st) =>
|
||||||
|
st[
|
||||||
|
bodyshop.accountingconfig && bodyshop.accountingconfig.qbo
|
||||||
|
? "paymentid"
|
||||||
|
: "id"
|
||||||
|
]
|
||||||
|
),
|
||||||
|
payment: {
|
||||||
|
exportedat: new Date(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!!!paymentUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "paymentsuccessexport",
|
||||||
|
message: t("payments.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("payments.errors.exporting", {
|
||||||
|
error: JSON.stringify(paymentUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setSelectedPayments) {
|
if (setSelectedPayments) {
|
||||||
@@ -165,7 +171,7 @@ export function PaymentExportButton({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
if (!!loadingCallback) loadingCallback(false);
|
if (!!loadingCallback) loadingCallback(false);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export function PaymentsExportAllButton({
|
|||||||
disabled,
|
disabled,
|
||||||
loadingCallback,
|
loadingCallback,
|
||||||
completedCallback,
|
completedCallback,
|
||||||
|
refetch
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updatePayments] = useMutation(UPDATE_PAYMENTS);
|
const [updatePayments] = useMutation(UPDATE_PAYMENTS);
|
||||||
@@ -92,54 +93,61 @@ export function PaymentsExportAllButton({
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
await insertExportLog({
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
variables: {
|
//QBO Logs are handled server side.
|
||||||
logs: [
|
await insertExportLog({
|
||||||
{
|
variables: {
|
||||||
bodyshopid: bodyshop.id,
|
logs: [
|
||||||
paymentid: key,
|
{
|
||||||
successful: false,
|
bodyshopid: bodyshop.id,
|
||||||
message: JSON.stringify(
|
paymentid: key,
|
||||||
failedTransactions.map((ft) => ft.errorMessage)
|
successful: false,
|
||||||
),
|
message: JSON.stringify(
|
||||||
useremail: currentUser.email,
|
failedTransactions.map((ft) => ft.errorMessage)
|
||||||
},
|
),
|
||||||
],
|
useremail: currentUser.email,
|
||||||
},
|
},
|
||||||
});
|
],
|
||||||
} else {
|
|
||||||
await insertExportLog({
|
|
||||||
variables: {
|
|
||||||
logs: [
|
|
||||||
{
|
|
||||||
bodyshopid: bodyshop.id,
|
|
||||||
paymentid: key,
|
|
||||||
successful: true,
|
|
||||||
useremail: currentUser.email,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const paymentUpdateResponse = await updatePayments({
|
|
||||||
variables: {
|
|
||||||
paymentIdList: [key],
|
|
||||||
payment: {
|
|
||||||
exportedat: new Date(),
|
|
||||||
},
|
},
|
||||||
},
|
|
||||||
});
|
|
||||||
if (!!!paymentUpdateResponse.errors) {
|
|
||||||
notification.open({
|
|
||||||
type: "success",
|
|
||||||
key: "paymentsuccessexport",
|
|
||||||
message: t("payments.successes.exported"),
|
|
||||||
});
|
});
|
||||||
} else {
|
}
|
||||||
notification["error"]({
|
} else {
|
||||||
message: t("payments.errors.exporting", {
|
if (!(bodyshop.accountingconfig && bodyshop.accountingconfig.qbo)) {
|
||||||
error: JSON.stringify(paymentUpdateResponse.error),
|
//QBO Logs are handled server side.
|
||||||
}),
|
|
||||||
|
await insertExportLog({
|
||||||
|
variables: {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
paymentid: key,
|
||||||
|
successful: true,
|
||||||
|
useremail: currentUser.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
const paymentUpdateResponse = await updatePayments({
|
||||||
|
variables: {
|
||||||
|
paymentIdList: [key],
|
||||||
|
payment: {
|
||||||
|
exportedat: new Date(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!!!paymentUpdateResponse.errors) {
|
||||||
|
notification.open({
|
||||||
|
type: "success",
|
||||||
|
key: "paymentsuccessexport",
|
||||||
|
message: t("payments.successes.exported"),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
notification["error"]({
|
||||||
|
message: t("payments.errors.exporting", {
|
||||||
|
error: JSON.stringify(paymentUpdateResponse.error),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})()
|
})()
|
||||||
@@ -148,6 +156,7 @@ export function PaymentsExportAllButton({
|
|||||||
await Promise.all(proms);
|
await Promise.all(proms);
|
||||||
if (!!completedCallback) completedCallback([]);
|
if (!!completedCallback) completedCallback([]);
|
||||||
if (!!loadingCallback) loadingCallback(false);
|
if (!!loadingCallback) loadingCallback(false);
|
||||||
|
if (bodyshop.accountingconfig && bodyshop.accountingconfig.qbo) refetch();
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export function AccountingPayablesContainer({
|
|||||||
checkPartnerStatus(bodyshop, true);
|
checkPartnerStatus(bodyshop, true);
|
||||||
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
||||||
|
|
||||||
const { loading, error, data } = useQuery(QUERY_BILLS_FOR_EXPORT, {
|
const { loading, error, data, refetch } = useQuery(QUERY_BILLS_FOR_EXPORT, {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
nextFetchPolicy: "network-only",
|
nextFetchPolicy: "network-only",
|
||||||
});
|
});
|
||||||
@@ -73,6 +73,7 @@ export function AccountingPayablesContainer({
|
|||||||
<AccountingPayablesTable
|
<AccountingPayablesTable
|
||||||
loadaing={loading}
|
loadaing={loading}
|
||||||
bills={data ? data.bills : []}
|
bills={data ? data.bills : []}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -44,10 +44,13 @@ export function AccountingPaymentsContainer({
|
|||||||
checkPartnerStatus(bodyshop, true);
|
checkPartnerStatus(bodyshop, true);
|
||||||
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
||||||
|
|
||||||
const { loading, error, data } = useQuery(QUERY_PAYMENTS_FOR_EXPORT, {
|
const { loading, error, data, refetch } = useQuery(
|
||||||
fetchPolicy: "network-only",
|
QUERY_PAYMENTS_FOR_EXPORT,
|
||||||
nextFetchPolicy: "network-only",
|
{
|
||||||
});
|
fetchPolicy: "network-only",
|
||||||
|
nextFetchPolicy: "network-only",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
const noPath =
|
const noPath =
|
||||||
@@ -70,6 +73,7 @@ export function AccountingPaymentsContainer({
|
|||||||
<AccountingPaymentsTable
|
<AccountingPaymentsTable
|
||||||
loadaing={loading}
|
loadaing={loading}
|
||||||
payments={data ? data.payments : []}
|
payments={data ? data.payments : []}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export function AccountingReceivablesContainer({
|
|||||||
checkPartnerStatus(bodyshop, true);
|
checkPartnerStatus(bodyshop, true);
|
||||||
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
}, [t, setBreadcrumbs, setSelectedHeader, bodyshop]);
|
||||||
|
|
||||||
const { loading, error, data } = useQuery(QUERY_JOBS_FOR_EXPORT, {
|
const { loading, error, data, refetch } = useQuery(QUERY_JOBS_FOR_EXPORT, {
|
||||||
variables: {
|
variables: {
|
||||||
invoicedStatus: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*",
|
invoicedStatus: bodyshop.md_ro_statuses.default_invoiced || "Invoiced*",
|
||||||
},
|
},
|
||||||
@@ -75,6 +75,7 @@ export function AccountingReceivablesContainer({
|
|||||||
<AccountingReceivablesTable
|
<AccountingReceivablesTable
|
||||||
loadaing={loading}
|
loadaing={loading}
|
||||||
jobs={data ? data.jobs : []}
|
jobs={data ? data.jobs : []}
|
||||||
|
refetch={refetch}
|
||||||
/>
|
/>
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ exports.default = async (req, res) => {
|
|||||||
|
|
||||||
exports.refresh = async (oauthClient, req) => {
|
exports.refresh = async (oauthClient, req) => {
|
||||||
try {
|
try {
|
||||||
logger.log("qbo-token-refresh", "DEBUG", req.user.email, null, null);
|
// logger.log("qbo-token-refresh", "DEBUG", req.user.email, null, null);
|
||||||
const authResponse = await oauthClient.refresh();
|
const authResponse = await oauthClient.refresh();
|
||||||
await client.request(queries.SET_QBO_AUTH, {
|
await client.request(queries.SET_QBO_AUTH, {
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
@@ -85,7 +85,7 @@ exports.refresh = async (oauthClient, req) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
exports.setNewRefreshToken = async (email, apiResponse) => {
|
exports.setNewRefreshToken = async (email, apiResponse) => {
|
||||||
logger.log("qbo-token-updated", "DEBUG", email, null, null);
|
//logger.log("qbo-token-updated", "DEBUG", email, null, null);
|
||||||
|
|
||||||
await client.request(queries.SET_QBO_AUTH, {
|
await client.request(queries.SET_QBO_AUTH, {
|
||||||
email,
|
email,
|
||||||
|
|||||||
@@ -59,8 +59,9 @@ exports.default = async (req, res) => {
|
|||||||
bills: billsToQuery,
|
bills: billsToQuery,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { bills } = result;
|
const { bills, bodyshops } = result;
|
||||||
const ret = [];
|
const ret = [];
|
||||||
|
const bodyshop = bodyshops[0];
|
||||||
|
|
||||||
for (const bill of bills) {
|
for (const bill of bills) {
|
||||||
try {
|
try {
|
||||||
@@ -86,9 +87,29 @@ exports.default = async (req, res) => {
|
|||||||
qbo_realmId,
|
qbo_realmId,
|
||||||
req,
|
req,
|
||||||
bill,
|
bill,
|
||||||
vendorRecord
|
vendorRecord,
|
||||||
|
bodyshop
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// //No error. Mark the job exported & insert export log.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.QBO_MARK_BILL_EXPORTED, {
|
||||||
|
billId: bill.id,
|
||||||
|
bill: {
|
||||||
|
exported: true,
|
||||||
|
exported_at: moment().tz(bodyshop.timezone),
|
||||||
|
},
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
billid: bill.id,
|
||||||
|
successful: true,
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
ret.push({ billid: bill.id, success: true });
|
ret.push({ billid: bill.id, success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
ret.push({
|
ret.push({
|
||||||
@@ -98,6 +119,24 @@ exports.default = async (req, res) => {
|
|||||||
(error && error.authResponse && error.authResponse.body) ||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
(error && error.message),
|
(error && error.message),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//Add the export log error.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.INSERT_EXPORT_LOG, {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
billid: bill.id,
|
||||||
|
successful: false,
|
||||||
|
message: JSON.stringify([
|
||||||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
|
(error && error.message),
|
||||||
|
]),
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +206,7 @@ async function InsertVendorRecord(oauthClient, qbo_realmId, req, bill) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) {
|
async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop) {
|
||||||
const { accounts, taxCodes, classes } = await QueryMetaData(
|
const { accounts, taxCodes, classes } = await QueryMetaData(
|
||||||
oauthClient,
|
oauthClient,
|
||||||
qbo_realmId,
|
qbo_realmId,
|
||||||
@@ -179,20 +218,20 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) {
|
|||||||
il,
|
il,
|
||||||
accounts,
|
accounts,
|
||||||
bill.job.class,
|
bill.job.class,
|
||||||
bill.job.bodyshop.md_responsibility_centers.sales_tax_codes,
|
bodyshop.md_responsibility_centers.sales_tax_codes,
|
||||||
classes,
|
classes,
|
||||||
taxCodes,
|
taxCodes,
|
||||||
bill.job.bodyshop.md_responsibility_centers.costs
|
bodyshop.md_responsibility_centers.costs
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
//QB USA with GST
|
//QB USA with GST
|
||||||
//This was required for the No. 1 Collision Group.
|
//This was required for the No. 1 Collision Group.
|
||||||
if (
|
if (
|
||||||
bill.job.bodyshop.accountingconfig &&
|
bodyshop.accountingconfig &&
|
||||||
bill.job.bodyshop.accountingconfig.qbo &&
|
bodyshop.accountingconfig.qbo &&
|
||||||
bill.job.bodyshop.accountingconfig.qbo_usa &&
|
bodyshop.accountingconfig.qbo_usa &&
|
||||||
bill.job.bodyshop.region_config.includes("CA_")
|
bodyshop.region_config.includes("CA_")
|
||||||
) {
|
) {
|
||||||
lines.push({
|
lines.push({
|
||||||
DetailType: "AccountBasedExpenseLineDetail",
|
DetailType: "AccountBasedExpenseLineDetail",
|
||||||
@@ -204,7 +243,7 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) {
|
|||||||
AccountRef: {
|
AccountRef: {
|
||||||
value:
|
value:
|
||||||
accounts[
|
accounts[
|
||||||
bill.job.bodyshop.md_responsibility_centers.taxes.federal
|
bodyshop.md_responsibility_centers.taxes.federal
|
||||||
.accountdesc
|
.accountdesc
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -239,6 +278,14 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) {
|
|||||||
}),
|
}),
|
||||||
DocNumber: bill.invoice_number,
|
DocNumber: bill.invoice_number,
|
||||||
//...(bill.job.class ? { ClassRef: { Id: classes[bill.job.class] } } : {}),
|
//...(bill.job.class ? { ClassRef: { Id: classes[bill.job.class] } } : {}),
|
||||||
|
...(!(
|
||||||
|
bodyshop.accountingconfig &&
|
||||||
|
bodyshop.accountingconfig.qbo &&
|
||||||
|
bodyshop.accountingconfig.qbo_usa &&
|
||||||
|
bodyshop.region_config.includes("CA_")
|
||||||
|
)
|
||||||
|
? { GlobalTaxCalculation: "TaxExcluded" }
|
||||||
|
: {}),
|
||||||
|
|
||||||
PrivateNote: `RO ${bill.job.ro_number || ""}`,
|
PrivateNote: `RO ${bill.job.ro_number || ""}`,
|
||||||
Line: lines,
|
Line: lines,
|
||||||
|
|||||||
@@ -155,6 +155,25 @@ exports.default = async (req, res) => {
|
|||||||
bodyshop
|
bodyshop
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// //No error. Mark the payment exported & insert export log.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.QBO_MARK_PAYMENT_EXPORTED, {
|
||||||
|
paymentId: payment.id,
|
||||||
|
payment: {
|
||||||
|
exportedat: moment().tz(bodyshop.timezone),
|
||||||
|
},
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
paymentid: payment.id,
|
||||||
|
successful: true,
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
ret.push({ paymentid: payment.id, success: true });
|
ret.push({ paymentid: payment.id, success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.log("qbo-payment-create-error", "ERROR", req.user.email, {
|
logger.log("qbo-payment-create-error", "ERROR", req.user.email, {
|
||||||
@@ -162,7 +181,24 @@ exports.default = async (req, res) => {
|
|||||||
(error && error.authResponse && error.authResponse.body) ||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
(error && error.message),
|
(error && error.message),
|
||||||
});
|
});
|
||||||
|
//Add the export log error.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.INSERT_EXPORT_LOG, {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
paymentid: payment.id,
|
||||||
|
successful: false,
|
||||||
|
message: JSON.stringify([
|
||||||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
|
(error && error.message),
|
||||||
|
]),
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
ret.push({
|
ret.push({
|
||||||
paymentid: payment.id,
|
paymentid: payment.id,
|
||||||
success: false,
|
success: false,
|
||||||
|
|||||||
@@ -139,6 +139,25 @@ exports.default = async (req, res) => {
|
|||||||
bodyshop,
|
bodyshop,
|
||||||
jobTier
|
jobTier
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// //No error. Mark the job exported & insert export log.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.QBO_MARK_JOB_EXPORTED, {
|
||||||
|
jobId: job.id,
|
||||||
|
job: {
|
||||||
|
status: bodyshop.md_ro_statuses.default_exported || "Exported*",
|
||||||
|
date_exported: moment().tz(bodyshop.timezone),
|
||||||
|
},
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
jobid: job.id,
|
||||||
|
successful: true,
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
ret.push({ jobid: job.id, success: true });
|
ret.push({ jobid: job.id, success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -149,6 +168,23 @@ exports.default = async (req, res) => {
|
|||||||
(error && error.authResponse && error.authResponse.body) ||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
(error && error.message),
|
(error && error.message),
|
||||||
});
|
});
|
||||||
|
//Add the export log error.
|
||||||
|
const result = await client
|
||||||
|
.setHeaders({ Authorization: BearerToken })
|
||||||
|
.request(queries.INSERT_EXPORT_LOG, {
|
||||||
|
logs: [
|
||||||
|
{
|
||||||
|
bodyshopid: bodyshop.id,
|
||||||
|
jobid: job.id,
|
||||||
|
successful: false,
|
||||||
|
message: JSON.stringify([
|
||||||
|
(error && error.authResponse && error.authResponse.body) ||
|
||||||
|
(error && error.message),
|
||||||
|
]),
|
||||||
|
useremail: req.user.email,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,14 +37,15 @@ exports.default = async (req, res) => {
|
|||||||
.request(queries.QUERY_BILLS_FOR_PAYABLES_EXPORT, {
|
.request(queries.QUERY_BILLS_FOR_PAYABLES_EXPORT, {
|
||||||
bills: billsToQuery,
|
bills: billsToQuery,
|
||||||
});
|
});
|
||||||
const { bills } = result;
|
const { bills, bodyshops } = result;
|
||||||
|
const bodyshop = bodyshops[0];
|
||||||
|
|
||||||
const QbXmlToExecute = [];
|
const QbXmlToExecute = [];
|
||||||
bills.map((i) => {
|
bills.map((i) => {
|
||||||
QbXmlToExecute.push({
|
QbXmlToExecute.push({
|
||||||
id: i.id,
|
id: i.id,
|
||||||
okStatusCodes: ["0"],
|
okStatusCodes: ["0"],
|
||||||
qbxml: generateBill(i),
|
qbxml: generateBill(i, bodyshop),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -62,7 +63,7 @@ exports.default = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const generateBill = (bill) => {
|
const generateBill = (bill, bodyshop) => {
|
||||||
const billQbxmlObj = {
|
const billQbxmlObj = {
|
||||||
QBXML: {
|
QBXML: {
|
||||||
QBXMLMsgsRq: {
|
QBXMLMsgsRq: {
|
||||||
@@ -87,7 +88,7 @@ const generateBill = (bill) => {
|
|||||||
ExpenseLineAdd: bill.billlines.map((il) =>
|
ExpenseLineAdd: bill.billlines.map((il) =>
|
||||||
generateBillLine(
|
generateBillLine(
|
||||||
il,
|
il,
|
||||||
bill.job.bodyshop.md_responsibility_centers,
|
bodyshop.md_responsibility_centers,
|
||||||
bill.job.class
|
bill.job.class
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ query QUERY_JOBS_FOR_RECEIVABLES_EXPORT($ids: [uuid!]!) {
|
|||||||
accountingconfig
|
accountingconfig
|
||||||
md_ins_cos
|
md_ins_cos
|
||||||
timezone
|
timezone
|
||||||
|
md_ro_statuses
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
@@ -408,6 +409,13 @@ query QUERY_JOBS_FOR_PBS_EXPORT($id: uuid!) {
|
|||||||
|
|
||||||
exports.QUERY_BILLS_FOR_PAYABLES_EXPORT = `
|
exports.QUERY_BILLS_FOR_PAYABLES_EXPORT = `
|
||||||
query QUERY_BILLS_FOR_PAYABLES_EXPORT($bills: [uuid!]!) {
|
query QUERY_BILLS_FOR_PAYABLES_EXPORT($bills: [uuid!]!) {
|
||||||
|
bodyshops(where: {associations: {active: {_eq: true}}}) {
|
||||||
|
id
|
||||||
|
md_responsibility_centers
|
||||||
|
timezone
|
||||||
|
region_config
|
||||||
|
accountingconfig
|
||||||
|
}
|
||||||
bills(where: {id: {_in: $bills}}) {
|
bills(where: {id: {_in: $bills}}) {
|
||||||
id
|
id
|
||||||
date
|
date
|
||||||
@@ -424,12 +432,6 @@ query QUERY_BILLS_FOR_PAYABLES_EXPORT($bills: [uuid!]!) {
|
|||||||
ownr_ln
|
ownr_ln
|
||||||
ownr_co_nm
|
ownr_co_nm
|
||||||
class
|
class
|
||||||
bodyshop{
|
|
||||||
md_responsibility_centers
|
|
||||||
timezone
|
|
||||||
region_config
|
|
||||||
accountingconfig
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
billlines{
|
billlines{
|
||||||
id
|
id
|
||||||
@@ -1482,6 +1484,7 @@ mutation MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $log: exportlog
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports.INSERT_EXPORT_LOG = `
|
exports.INSERT_EXPORT_LOG = `
|
||||||
mutation INSERT_EXPORT_LOG($log: exportlog_insert_input!) {
|
mutation INSERT_EXPORT_LOG($log: exportlog_insert_input!) {
|
||||||
insert_exportlog_one(object: $log) {
|
insert_exportlog_one(object: $log) {
|
||||||
@@ -1534,4 +1537,52 @@ exports.QUERY_JOB_ID_MIXDATA = `query QUERY_JOB_ID_MIXDATA($roNumbers: [String!]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports.QBO_MARK_JOB_EXPORTED = `
|
||||||
|
mutation QBO_MARK_JOB_EXPORTED($jobId: uuid!, $job: jobs_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||||
|
insert_exportlog(objects: $logs) {
|
||||||
|
affected_rows
|
||||||
|
}
|
||||||
|
update_jobs(where: {id: {_eq: $jobId}}, _set: $job) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
`;
|
||||||
|
exports.QBO_MARK_BILL_EXPORTED = `
|
||||||
|
mutation QBO_MARK_BILL_EXPORTED($billId: uuid!, $bill: bills_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||||
|
insert_exportlog(objects: $logs) {
|
||||||
|
affected_rows
|
||||||
|
}
|
||||||
|
update_bills(where: { id: { _eq: $billId } }, _set: $bill) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports.QBO_MARK_PAYMENT_EXPORTED = `
|
||||||
|
mutation QBO_MARK_PAYMENT_EXPORTED($paymentId: uuid!, $payment: payments_set_input!, $logs: [exportlog_insert_input!]!) {
|
||||||
|
insert_exportlog(objects: $logs) {
|
||||||
|
affected_rows
|
||||||
|
}
|
||||||
|
update_payments(where: {id: {_eq: $paymentId}}, _set: $payment) {
|
||||||
|
returning {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`;
|
||||||
|
|
||||||
|
exports.INSERT_EXPORT_LOG = `
|
||||||
|
mutation INSERT_EXPORT_LOG($logs: [exportlog_insert_input!]!) {
|
||||||
|
insert_exportlog(objects: $logs) {
|
||||||
|
affected_rows
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user