Restricted invoice export to 1 at a time BOD-139
This commit is contained in:
@@ -13,7 +13,8 @@ export default function AccountingPayablesTableComponent({
|
||||
invoices,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const [selectedInvoices, setSelectedInvoices] = useState([]);
|
||||
const [transInProgress, setTransInProgress] = useState(false);
|
||||
const [state, setState] = useState({
|
||||
sortedInfo: {},
|
||||
search: "",
|
||||
@@ -64,6 +65,17 @@ export default function AccountingPayablesTableComponent({
|
||||
</Link>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: t("jobs.fields.ro_number"),
|
||||
dataIndex: "ro_number",
|
||||
key: "ro_number",
|
||||
sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number),
|
||||
sortOrder:
|
||||
state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
|
||||
render: (text, record) => (
|
||||
<Link to={`/manage/jobs/${record.job.id}`}>{record.job.ro_number}</Link>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: t("invoices.fields.date"),
|
||||
dataIndex: "date",
|
||||
@@ -107,14 +119,16 @@ export default function AccountingPayablesTableComponent({
|
||||
render: (text, record) => (
|
||||
<div>
|
||||
<InvoiceExportButton
|
||||
invoiceId={record.id}
|
||||
disabled={!!record.exported}
|
||||
|
||||
invoiceId={record.id}
|
||||
disabled={transInProgress || !!record.exported}
|
||||
loadingCallback={setTransInProgress}
|
||||
/>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
console.log('transInProgress', transInProgress)
|
||||
const handleSearch = (e) => {
|
||||
setState({ ...state, search: e.target.value });
|
||||
};
|
||||
@@ -149,10 +163,22 @@ export default function AccountingPayablesTableComponent({
|
||||
}}
|
||||
dataSource={dataSource}
|
||||
size="small"
|
||||
pagination={{ position: "top" }}
|
||||
pagination={{ position: "top", pageSize: 50 }}
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
onChange={handleTableChange}
|
||||
rowSelection={{
|
||||
onSelectAll: (selected, selectedRows) =>
|
||||
setSelectedInvoices(selectedRows.map((i) => i.id)),
|
||||
onSelect: (record, selected, selectedRows, nativeEvent) => {
|
||||
setSelectedInvoices(selectedRows.map((i) => i.id));
|
||||
},
|
||||
getCheckboxProps: (record) => ({
|
||||
disabled: record.exported,
|
||||
}),
|
||||
selectedRowKeys: selectedInvoices,
|
||||
type: "checkbox",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -12,13 +12,20 @@ const mapStateToProps = createStructuredSelector({
|
||||
bodyshop: selectBodyshop,
|
||||
});
|
||||
|
||||
export function InvoiceExportButton({ bodyshop, invoiceId, disabled }) {
|
||||
export function InvoiceExportButton({
|
||||
bodyshop,
|
||||
invoiceId,
|
||||
disabled,
|
||||
loadingCallback,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [updateInvoice] = useMutation(UPDATE_INVOICE);
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const handleQbxml = async () => {
|
||||
setLoading(true);
|
||||
if (!!loadingCallback) loadingCallback(true);
|
||||
|
||||
let QbXmlResponse;
|
||||
try {
|
||||
QbXmlResponse = await axios.post(
|
||||
@@ -38,6 +45,7 @@ export function InvoiceExportButton({ bodyshop, invoiceId, disabled }) {
|
||||
error: "Unable to retrieve QBXML. " + JSON.stringify(error.message),
|
||||
}),
|
||||
});
|
||||
if (loadingCallback) loadingCallback(false);
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
@@ -45,7 +53,7 @@ export function InvoiceExportButton({ bodyshop, invoiceId, disabled }) {
|
||||
let PartnerResponse;
|
||||
try {
|
||||
PartnerResponse = await axios.post(
|
||||
"http://e9c5a8ed9079.ngrok.io/qb/receivables",
|
||||
"http://e9c5a8ed9079.ngrok.io/qb/",
|
||||
QbXmlResponse.data
|
||||
);
|
||||
} catch (error) {
|
||||
@@ -53,33 +61,34 @@ export function InvoiceExportButton({ bodyshop, invoiceId, disabled }) {
|
||||
notification["error"]({
|
||||
message: t("invoices.errors.exporting-partner"),
|
||||
});
|
||||
if (!!loadingCallback) loadingCallback(false);
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("PartnerResponse", PartnerResponse);
|
||||
// const invoiceUpdateResponse = await updateInvoice({
|
||||
// variables: {
|
||||
// invoiceId: invoiceId,
|
||||
// invoice: {
|
||||
// exported: true,
|
||||
// exported_at: new Date(),
|
||||
// },
|
||||
// },
|
||||
// });
|
||||
const invoiceUpdateResponse = await updateInvoice({
|
||||
variables: {
|
||||
invoiceId: invoiceId,
|
||||
invoice: {
|
||||
exported: true,
|
||||
exported_at: new Date(),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// if (!!!invoiceUpdateResponse.errors) {
|
||||
// notification["success"]({
|
||||
// message: t("jobs.successes.exported"),
|
||||
// });
|
||||
// } else {
|
||||
// notification["error"]({
|
||||
// message: t("jobs.errors.exporting", {
|
||||
// error: JSON.stringify(invoiceUpdateResponse.error),
|
||||
// }),
|
||||
// });
|
||||
// }
|
||||
if (!!!invoiceUpdateResponse.errors) {
|
||||
notification["success"]({
|
||||
message: t("jobs.successes.exported"),
|
||||
});
|
||||
} else {
|
||||
notification["error"]({
|
||||
message: t("jobs.errors.exporting", {
|
||||
error: JSON.stringify(invoiceUpdateResponse.error),
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
if (!!loadingCallback) loadingCallback(false);
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ export function JobsCloseExportButton({ bodyshop, jobId, disabled }) {
|
||||
let PartnerResponse;
|
||||
try {
|
||||
PartnerResponse = await axios.post(
|
||||
"http://localhost:1337/qb/receivables",
|
||||
"http://localhost:1337/qb/",
|
||||
QbXmlResponse.data,
|
||||
{
|
||||
headers: {
|
||||
|
||||
@@ -35,7 +35,12 @@ export const QUERY_INVOICES_FOR_EXPORT = gql`
|
||||
exported
|
||||
date
|
||||
invoice_number
|
||||
is_credit_memo
|
||||
total
|
||||
job {
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
vendor {
|
||||
name
|
||||
id
|
||||
|
||||
@@ -160,6 +160,10 @@ export const MARK_LATEST_APPOINTMENT_AS_ARRIVED = gql`
|
||||
_set: { arrived: true }
|
||||
) {
|
||||
affected_rows
|
||||
returning {
|
||||
id
|
||||
arrived
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -49,8 +49,8 @@ const generateBill = (invoice) => {
|
||||
QBXML: {
|
||||
QBXMLMsgsRq: {
|
||||
"@onError": "continueOnError",
|
||||
BillAddRq: {
|
||||
BillAdd: {
|
||||
[`${invoice.is_credit_memo ? "VendorCreditAddRq" : "BillAddRq"}`]: {
|
||||
[`${invoice.is_credit_memo ? "VendorCreditAdd" : "BillAdd"}`]: {
|
||||
VendorRef: {
|
||||
FullName: invoice.vendor.name,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user