Merged in release/2021-12-17 (pull request #313)
release/2021-12-17 Approved-by: Patrick Fic
This commit is contained in:
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -3,6 +3,10 @@
|
|||||||
{
|
{
|
||||||
"pattern": "**/Test.xml",
|
"pattern": "**/Test.xml",
|
||||||
"systemId": "file:///Users/pfic/Downloads/IMEX.xsd"
|
"systemId": "file:///Users/pfic/Downloads/IMEX.xsd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pattern": "**/IMEX.xml",
|
||||||
|
"systemId": "logs/IMEX.xsd"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,3 +134,11 @@
|
|||||||
background: unset;
|
background: unset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ReactGridGallery_tile-icon-bar {
|
||||||
|
div {
|
||||||
|
svg {
|
||||||
|
fill: #1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -110,13 +110,6 @@ export function AccountingReceivablesTableComponent({
|
|||||||
sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
|
sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order,
|
||||||
render: (text, record) => {
|
|
||||||
return record.clm_no ? (
|
|
||||||
<span>{record.clm_no}</span>
|
|
||||||
) : (
|
|
||||||
t("general.labels.unknown")
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.clm_total"),
|
title: t("jobs.fields.clm_total"),
|
||||||
@@ -126,11 +119,7 @@ export function AccountingReceivablesTableComponent({
|
|||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order,
|
||||||
render: (text, record) => {
|
render: (text, record) => {
|
||||||
return record.clm_total ? (
|
return <CurrencyFormatter>{record.clm_total}</CurrencyFormatter>;
|
||||||
<CurrencyFormatter>{record.clm_total}</CurrencyFormatter>
|
|
||||||
) : (
|
|
||||||
t("general.labels.unknown")
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
|
||||||
import { Input, notification, Space } from "antd";
|
|
||||||
import { FieldTimeOutlined } from "@ant-design/icons";
|
import { FieldTimeOutlined } from "@ant-design/icons";
|
||||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
|
||||||
import { useMutation } from "@apollo/client";
|
import { useMutation } from "@apollo/client";
|
||||||
import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries";
|
import { Input, notification } from "antd";
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { UPDATE_JOB_LINE } from "../../graphql/jobs-lines.queries";
|
||||||
|
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||||
|
|
||||||
export default function JobLineNotePopup({ jobline, disabled }) {
|
export default function JobLineNotePopup({ jobline, disabled }) {
|
||||||
const [editing, setEditing] = useState(false);
|
const [editing, setEditing] = useState(false);
|
||||||
@@ -57,21 +57,21 @@ export default function JobLineNotePopup({ jobline, disabled }) {
|
|||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{jobline.ioucreated && (
|
|
||||||
<Space>
|
|
||||||
<FieldTimeOutlined />
|
|
||||||
{t("joblines.labels.ioucreated")}
|
|
||||||
</Space>
|
|
||||||
)}
|
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
width: "100%",
|
width: "100%",
|
||||||
minHeight: "2rem",
|
...(jobline.ioucreated ? {} : { minHeight: "2rem" }),
|
||||||
cursor: "pointer",
|
cursor: "pointer",
|
||||||
}}
|
}}
|
||||||
onClick={() => !disabled && setEditing(true)}
|
onClick={() => !disabled && setEditing(true)}
|
||||||
>
|
>
|
||||||
{jobline.notes}
|
{jobline.ioucreated && (
|
||||||
|
<div>
|
||||||
|
<FieldTimeOutlined style={{ margin: 0, padding: 0 }} />
|
||||||
|
{t("joblines.labels.ioucreated")}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{jobline.notes || null}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ export function JobLineStatusPopup({ bodyshop, jobline, disabled }) {
|
|||||||
value={status}
|
value={status}
|
||||||
onSelect={handleChange}
|
onSelect={handleChange}
|
||||||
onBlur={handleSave}
|
onBlur={handleSave}
|
||||||
|
onClear={() => handleChange(null)}
|
||||||
>
|
>
|
||||||
{Object.values(bodyshop.md_order_statuses).map((s, idx) => (
|
{Object.values(bodyshop.md_order_statuses).map((s, idx) => (
|
||||||
<Select.Option key={idx} value={s}>
|
<Select.Option key={idx} value={s}>
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ export async function CreateIouForJob(
|
|||||||
delete line.id;
|
delete line.id;
|
||||||
delete line.__typename;
|
delete line.__typename;
|
||||||
line.oem_partno = `${line.oem_partno ? `${line.oem_partno} - ` : ``}IOU $${
|
line.oem_partno = `${line.oem_partno ? `${line.oem_partno} - ` : ``}IOU $${
|
||||||
line.act_price || 0
|
(line.act_price && line.act_price.toFixed(2)) || 0
|
||||||
}/${line.mod_lb_hrs || 0}hrs`;
|
}/${line.mod_lb_hrs || 0}hrs`;
|
||||||
line.act_price = 0;
|
line.act_price = 0;
|
||||||
line.mod_lb_hrs = 0;
|
line.mod_lb_hrs = 0;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ const moment = require("moment");
|
|||||||
var builder = require("xmlbuilder2");
|
var builder = require("xmlbuilder2");
|
||||||
const _ = require("lodash");
|
const _ = require("lodash");
|
||||||
const logger = require("../utils/logger");
|
const logger = require("../utils/logger");
|
||||||
|
const fs = require("fs");
|
||||||
require("dotenv").config({
|
require("dotenv").config({
|
||||||
path: path.resolve(
|
path: path.resolve(
|
||||||
process.cwd(),
|
process.cwd(),
|
||||||
@@ -47,7 +48,7 @@ exports.default = async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { jobs } = await client.request(queries.AUTOHOUSE_QUERY, {
|
const { jobs } = await client.request(queries.AUTOHOUSE_QUERY, {
|
||||||
bodyshopid: bodyshop.id,
|
bodyshopid: bodyshop.id,
|
||||||
start: moment().subtract(30, "days").startOf("day"),
|
start: moment().subtract(3, "days").startOf("day"),
|
||||||
});
|
});
|
||||||
|
|
||||||
const autoHouseObject = {
|
const autoHouseObject = {
|
||||||
@@ -111,13 +112,16 @@ exports.default = async (req, res) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.json(allxmlsToUpload);
|
|
||||||
|
|
||||||
if (process.env.NODE_ENV !== "production") {
|
//if (process.env.NODE_ENV !== "production") {
|
||||||
res.json(allxmlsToUpload);
|
for (const xmlObj of allxmlsToUpload) {
|
||||||
return;
|
fs.writeFileSync(`./logs/${xmlObj.filename}`, xmlObj.xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res.json(allxmlsToUpload);
|
||||||
|
return;
|
||||||
|
// }
|
||||||
|
|
||||||
let sftp = new Client();
|
let sftp = new Client();
|
||||||
sftp.on("error", (errors) =>
|
sftp.on("error", (errors) =>
|
||||||
logger.log("autohouse-sftp-error", "ERROR", "api", null, {
|
logger.log("autohouse-sftp-error", "ERROR", "api", null, {
|
||||||
@@ -631,8 +635,9 @@ const CreateCosts = (job) => {
|
|||||||
billTotalsByCostCenters[defaultCosts.PAP] || Dinero()
|
billTotalsByCostCenters[defaultCosts.PAP] || Dinero()
|
||||||
),
|
),
|
||||||
PartsAMCost: billTotalsByCostCenters[defaultCosts.PAA] || Dinero(),
|
PartsAMCost: billTotalsByCostCenters[defaultCosts.PAA] || Dinero(),
|
||||||
PartsReconditionedCost: Dinero(),
|
PartsReconditionedCost:
|
||||||
PartsRecycledCost: billTotalsByCostCenters[defaultCosts.PAR] || Dinero(),
|
billTotalsByCostCenters[defaultCosts.PAM] || Dinero(),
|
||||||
|
PartsRecycledCost: billTotalsByCostCenters[defaultCosts.PAL] || Dinero(),
|
||||||
PartsOtherCost: billTotalsByCostCenters[defaultCosts.PAO] || Dinero(),
|
PartsOtherCost: billTotalsByCostCenters[defaultCosts.PAO] || Dinero(),
|
||||||
SubletTotalCost: billTotalsByCostCenters[defaultCosts.PAS] || Dinero(),
|
SubletTotalCost: billTotalsByCostCenters[defaultCosts.PAS] || Dinero(),
|
||||||
BodyLaborTotalCost: ticketTotalsByCostCenter[defaultCosts.LAB] || Dinero(),
|
BodyLaborTotalCost: ticketTotalsByCostCenter[defaultCosts.LAB] || Dinero(),
|
||||||
@@ -700,7 +705,7 @@ const GenerateDetailLines = (line, statuses) => {
|
|||||||
OrderedOn: null,
|
OrderedOn: null,
|
||||||
OriginalCost: null,
|
OriginalCost: null,
|
||||||
OriginalInvoiceNumber: null,
|
OriginalInvoiceNumber: null,
|
||||||
PriceEach: (line.billlines[0] && line.billlines[0].actual_cost) || 0,
|
PriceEach: (line.billlines[0] && line.billlines[0].retail_price) || 0,
|
||||||
PartNumber: _.escape(line.oem_partno),
|
PartNumber: _.escape(line.oem_partno),
|
||||||
ProfitPercent: null,
|
ProfitPercent: null,
|
||||||
PurchaseOrderNumber: null,
|
PurchaseOrderNumber: null,
|
||||||
@@ -717,7 +722,7 @@ const GenerateDetailLines = (line, statuses) => {
|
|||||||
OrderedBy: null,
|
OrderedBy: null,
|
||||||
ShipVia: null,
|
ShipVia: null,
|
||||||
VendorContact: null,
|
VendorContact: null,
|
||||||
EstimateAmount: line.act_price || 0,
|
EstimateAmount: line.act_price * line.part_qty || 0, //Rebecca
|
||||||
};
|
};
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -525,7 +525,7 @@ exports.QUERY_EMPLOYEE_PIN = `query QUERY_EMPLOYEE_PIN($shopId: uuid!, $employee
|
|||||||
}`;
|
}`;
|
||||||
|
|
||||||
exports.AUTOHOUSE_QUERY = `query AUTOHOUSE_EXPORT($start: timestamptz, $bodyshopid: uuid!) {
|
exports.AUTOHOUSE_QUERY = `query AUTOHOUSE_EXPORT($start: timestamptz, $bodyshopid: uuid!) {
|
||||||
jobs(where: {_and: [{converted: {_eq: true}}, {updated_at: {_gt: $start}}, {shopid: {_eq: $bodyshopid}}]} ) {
|
jobs(where: {_and: [{converted: {_eq: true}}, {updated_at: {_gt: $start}}, {shopid: {_eq: $bodyshopid}}]}) {
|
||||||
id
|
id
|
||||||
ro_number
|
ro_number
|
||||||
status
|
status
|
||||||
|
|||||||
Reference in New Issue
Block a user