Additional fixes for exporting

This commit is contained in:
Patrick Fic
2021-02-16 18:29:22 -08:00
parent 9533e7c4e0
commit 3cfd8173a0
17 changed files with 552 additions and 94 deletions

View File

@@ -3255,6 +3255,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>md_payment_types</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>md_referral_sources</name> <name>md_referral_sources</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -9,6 +9,7 @@ import { auth } from "../../firebase/firebase.utils";
import { UPDATE_BILLS } from "../../graphql/bills.queries"; import { UPDATE_BILLS } from "../../graphql/bills.queries";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import { logImEXEvent } from "../../firebase/firebase.utils"; import { logImEXEvent } from "../../firebase/firebase.utils";
import _ from "lodash";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -72,43 +73,49 @@ export function PayableExportAll({
} }
console.log("handleQbxml -> PartnerResponse", PartnerResponse); console.log("handleQbxml -> PartnerResponse", PartnerResponse);
const failedTransactions = PartnerResponse.data.filter((r) => !r.success); const groupedData = _.groupBy(PartnerResponse.data, "id");
const successfulTransactions = PartnerResponse.data.filter( const proms = [];
(r) => r.success Object.keys(groupedData).forEach((key) => {
); proms.push(
if (failedTransactions.length > 0) { (async () => {
//Uh oh. At least one was no good. const failedTransactions = groupedData[key].filter((r) => !r.success);
failedTransactions.map((ft) =>
notification["error"]({
message: t("bills.errors.exporting", {
error: ft.errorMessage || "",
}),
})
);
}
if (successfulTransactions.length > 0) {
const billUpdateResponse = await updateBill({
variables: {
billIdList: successfulTransactions.map((st) => st.id),
bill: {
exported: true,
exported_at: new Date(),
},
},
});
if (!!!billUpdateResponse.errors) {
notification["success"]({
message: t("bills.successes.exported"),
});
} else {
notification["error"]({
message: t("bills.errors.exporting", {
error: JSON.stringify(billUpdateResponse.error),
}),
});
}
}
if (failedTransactions.length > 0) {
//Uh oh. At least one was no good.
failedTransactions.map((ft) =>
notification["error"]({
message: t("bills.errors.exporting", {
error: ft.errorMessage || "",
}),
})
);
} else {
const billUpdateResponse = await updateBill({
variables: {
billIdList: [key],
bill: {
exported: true,
exported_at: new Date(),
},
},
});
if (!!!billUpdateResponse.errors) {
notification["success"]({
message: t("bills.successes.exported"),
});
} else {
notification["error"]({
message: t("bills.errors.exporting", {
error: JSON.stringify(billUpdateResponse.error),
}),
});
}
}
})()
);
});
await Promise.all(proms);
if (!!completedCallback) completedCallback([]); if (!!completedCallback) completedCallback([]);
if (!!loadingCallback) loadingCallback(false); if (!!loadingCallback) loadingCallback(false);
setLoading(false); setLoading(false);

View File

@@ -107,16 +107,11 @@ export function PaymentFormComponent({
]} ]}
> >
<Select disabled={disabled}> <Select disabled={disabled}>
<Select.Option value="Visa">Visa</Select.Option> {bodyshop.md_payment_types.map((v, idx) => (
<Select.Option value="Master Card">Mastercard</Select.Option> <Select.Option key={idx} value={v}>
<Select.Option value="American Express"> {v}
American Express </Select.Option>
</Select.Option> ))}
<Select.Option value="Discover">Discover</Select.Option>
<Select.Option value="Cash">Cash</Select.Option>
<Select.Option value="Cheque">Cheque</Select.Option>
<Select.Option value="Interac Debit">Interac Debit</Select.Option>
<Select.Option value="EFT">EFT</Select.Option>
</Select> </Select>
</Form.Item> </Form.Item>

View File

@@ -570,6 +570,19 @@ export default function ShopInfoComponent({ form, saveLoading }) {
}} }}
</Form.List> </Form.List>
<LayoutFormRow> <LayoutFormRow>
<Form.Item
name={["md_payment_types"]}
label={t("bodyshop.fields.md_payment_types")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item <Form.Item
name={["md_classes"]} name={["md_classes"]}
label={t("bodyshop.fields.md_classes")} label={t("bodyshop.fields.md_classes")}

View File

@@ -45,7 +45,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
return ( return (
<div> <div>
<strong>{t("bodyshop.labels.responsibilitycenters.title")}</strong>= <strong>{t("bodyshop.labels.responsibilitycenters.title")}</strong>
<div> <div>
<strong>{t("bodyshop.labels.responsibilitycenters.costs")}</strong> <strong>{t("bodyshop.labels.responsibilitycenters.costs")}</strong>
<Form.List name={["md_responsibility_centers", "costs"]}> <Form.List name={["md_responsibility_centers", "costs"]}>
@@ -1350,7 +1350,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<InputNumber precision={2} /> <InputNumber precision={2} />
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow> <LayoutFormRow>
<Form.Item <Form.Item
label={t("bodyshop.fields.responsibilitycenters.ar")} label={t("bodyshop.fields.responsibilitycenters.ar")}
@@ -1415,7 +1414,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow> <LayoutFormRow>
<Form.Item <Form.Item
label={t("bodyshop.fields.responsibilitycenters.ar")} label={t("bodyshop.fields.responsibilitycenters.ap")}
rules={[ rules={[
{ {
required: true, required: true,
@@ -1475,6 +1474,68 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow>
<Form.Item
label={t("bodyshop.fields.responsibilitycenters.refund")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "refund", "name"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountnumber")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "refund", "accountnumber"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountname")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "refund", "accountname"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountdesc")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "refund", "accountdesc"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.responsibilitycenter_accountitem")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["md_responsibility_centers", "refund", "accountitem"]}
>
<Input />
</Form.Item>
</LayoutFormRow>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -78,6 +78,7 @@ export const QUERY_BODYSHOP = gql`
default_adjustment_rate default_adjustment_rate
workingdays workingdays
use_fippa use_fippa
md_payment_types
employees { employees {
id id
first_name first_name
@@ -154,6 +155,7 @@ export const UPDATE_SHOP = gql`
default_adjustment_rate default_adjustment_rate
workingdays workingdays
use_fippa use_fippa
md_payment_types
employees { employees {
id id
first_name first_name

View File

@@ -214,6 +214,7 @@
"md_categories": "Categories", "md_categories": "Categories",
"md_classes": "Classes", "md_classes": "Classes",
"md_ins_cos": "Insurance Companies", "md_ins_cos": "Insurance Companies",
"md_payment_types": "Payment Types",
"md_referral_sources": "Referral Sources", "md_referral_sources": "Referral Sources",
"messaginglabel": "Messaging Preset Label", "messaginglabel": "Messaging Preset Label",
"messagingtext": "Messaging Preset Text", "messagingtext": "Messaging Preset Text",

View File

@@ -214,6 +214,7 @@
"md_categories": "", "md_categories": "",
"md_classes": "", "md_classes": "",
"md_ins_cos": "", "md_ins_cos": "",
"md_payment_types": "",
"md_referral_sources": "", "md_referral_sources": "",
"messaginglabel": "", "messaginglabel": "",
"messagingtext": "", "messagingtext": "",

View File

@@ -214,6 +214,7 @@
"md_categories": "", "md_categories": "",
"md_classes": "", "md_classes": "",
"md_ins_cos": "", "md_ins_cos": "",
"md_payment_types": "",
"md_referral_sources": "", "md_referral_sources": "",
"messaginglabel": "", "messaginglabel": "",
"messagingtext": "", "messagingtext": "",

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "md_payment_types";
type: run_sql

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "md_payment_types" jsonb NOT
NULL DEFAULT jsonb_build_array();
type: run_sql

View File

@@ -0,0 +1,78 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- accountingconfig
- address1
- address2
- appt_alt_transport
- appt_colors
- appt_length
- bill_tax_rates
- city
- country
- created_at
- default_adjustment_rate
- deliverchecklist
- email
- enforce_class
- federal_tax_id
- id
- imexshopid
- inhousevendorid
- insurance_vendor_id
- intakechecklist
- logo_img_path
- md_categories
- md_classes
- md_ins_cos
- md_labor_rates
- md_messaging_presets
- md_notes_presets
- md_order_statuses
- md_parts_locations
- md_rbac
- md_referral_sources
- md_responsibility_centers
- md_ro_statuses
- messagingservicesid
- phone
- prodtargethrs
- production_config
- region_config
- schedule_end_time
- schedule_start_time
- scoreboard_target
- shopname
- shoprates
- speedprint
- ssbuckets
- state
- state_tax_id
- stripe_acct_id
- target_touchtime
- template_header
- textid
- updated_at
- use_fippa
- workingdays
- zip_post
computed_fields: []
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
role: user
table:
name: bodyshops
schema: public
type: create_select_permission

View File

@@ -0,0 +1,79 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- accountingconfig
- address1
- address2
- appt_alt_transport
- appt_colors
- appt_length
- bill_tax_rates
- city
- country
- created_at
- default_adjustment_rate
- deliverchecklist
- email
- enforce_class
- federal_tax_id
- id
- imexshopid
- inhousevendorid
- insurance_vendor_id
- intakechecklist
- logo_img_path
- md_categories
- md_classes
- md_ins_cos
- md_labor_rates
- md_messaging_presets
- md_notes_presets
- md_order_statuses
- md_parts_locations
- md_payment_types
- md_rbac
- md_referral_sources
- md_responsibility_centers
- md_ro_statuses
- messagingservicesid
- phone
- prodtargethrs
- production_config
- region_config
- schedule_end_time
- schedule_start_time
- scoreboard_target
- shopname
- shoprates
- speedprint
- ssbuckets
- state
- state_tax_id
- stripe_acct_id
- target_touchtime
- template_header
- textid
- updated_at
- use_fippa
- workingdays
- zip_post
computed_fields: []
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
role: user
table:
name: bodyshops
schema: public
type: create_select_permission

View File

@@ -0,0 +1,71 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_update_permission
- args:
permission:
columns:
- accountingconfig
- address1
- address2
- appt_alt_transport
- appt_colors
- appt_length
- bill_tax_rates
- city
- country
- created_at
- default_adjustment_rate
- deliverchecklist
- email
- enforce_class
- federal_tax_id
- id
- inhousevendorid
- insurance_vendor_id
- intakechecklist
- logo_img_path
- md_categories
- md_classes
- md_ins_cos
- md_labor_rates
- md_messaging_presets
- md_notes_presets
- md_order_statuses
- md_parts_locations
- md_rbac
- md_referral_sources
- md_responsibility_centers
- md_ro_statuses
- phone
- prodtargethrs
- production_config
- schedule_end_time
- schedule_start_time
- scoreboard_target
- shopname
- shoprates
- speedprint
- ssbuckets
- state
- state_tax_id
- target_touchtime
- updated_at
- use_fippa
- workingdays
- zip_post
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
set: {}
role: user
table:
name: bodyshops
schema: public
type: create_update_permission

View File

@@ -0,0 +1,72 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_update_permission
- args:
permission:
columns:
- accountingconfig
- address1
- address2
- appt_alt_transport
- appt_colors
- appt_length
- bill_tax_rates
- city
- country
- created_at
- default_adjustment_rate
- deliverchecklist
- email
- enforce_class
- federal_tax_id
- id
- inhousevendorid
- insurance_vendor_id
- intakechecklist
- logo_img_path
- md_categories
- md_classes
- md_ins_cos
- md_labor_rates
- md_messaging_presets
- md_notes_presets
- md_order_statuses
- md_parts_locations
- md_payment_types
- md_rbac
- md_referral_sources
- md_responsibility_centers
- md_ro_statuses
- phone
- prodtargethrs
- production_config
- schedule_end_time
- schedule_start_time
- scoreboard_target
- shopname
- shoprates
- speedprint
- ssbuckets
- state
- state_tax_id
- target_touchtime
- updated_at
- use_fippa
- workingdays
- zip_post
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
set: {}
role: user
table:
name: bodyshops
schema: public
type: create_update_permission

View File

@@ -755,6 +755,7 @@ tables:
- md_notes_presets - md_notes_presets
- md_order_statuses - md_order_statuses
- md_parts_locations - md_parts_locations
- md_payment_types
- md_rbac - md_rbac
- md_referral_sources - md_referral_sources
- md_responsibility_centers - md_responsibility_centers
@@ -820,6 +821,7 @@ tables:
- md_notes_presets - md_notes_presets
- md_order_statuses - md_order_statuses
- md_parts_locations - md_parts_locations
- md_payment_types
- md_rbac - md_rbac
- md_referral_sources - md_referral_sources
- md_responsibility_centers - md_responsibility_centers

View File

@@ -37,10 +37,8 @@ exports.default = async (req, res) => {
const isThreeTier = bodyshop.accountingconfig.tiers === 3; const isThreeTier = bodyshop.accountingconfig.tiers === 3;
const twoTierPref = bodyshop.accountingconfig.twotierpref; const twoTierPref = bodyshop.accountingconfig.twotierpref;
const QbXmlToExecute = []; const QbXmlToExecute = [];
payments.map((i) => { payments.map((i) => {
if (isThreeTier) { if (isThreeTier) {
QbXmlToExecute.push({ QbXmlToExecute.push({
id: i.id, id: i.id,
@@ -48,7 +46,7 @@ exports.default = async (req, res) => {
qbxml: QbxmlReceivables.generateSourceCustomerQbxml(i.job, bodyshop), // Create the source customer. qbxml: QbxmlReceivables.generateSourceCustomerQbxml(i.job, bodyshop), // Create the source customer.
}); });
} }
QbXmlToExecute.push({ QbXmlToExecute.push({
id: i.id, id: i.id,
okStatusCodes: ["0", "3100"], okStatusCodes: ["0", "3100"],
@@ -60,7 +58,7 @@ exports.default = async (req, res) => {
twoTierPref twoTierPref
), ),
}); });
QbXmlToExecute.push({ QbXmlToExecute.push({
id: i.id, id: i.id,
okStatusCodes: ["0", "3100"], okStatusCodes: ["0", "3100"],
@@ -73,8 +71,6 @@ exports.default = async (req, res) => {
), ),
}); });
QbXmlToExecute.push({ QbXmlToExecute.push({
id: i.id, id: i.id,
okStatusCodes: ["0"], okStatusCodes: ["0"],
@@ -91,49 +87,96 @@ exports.default = async (req, res) => {
const generatePayment = (payment) => { const generatePayment = (payment) => {
console.log("generatePayment -> payment", payment); console.log("generatePayment -> payment", payment);
const paymentQbxmlObj = { let paymentQbxmlObj;
QBXML: { if (payment.amount > 0) {
QBXMLMsgsRq: { paymentQbxmlObj = {
"@onError": "continueOnError", QBXML: {
ReceivePaymentAddRq: { QBXMLMsgsRq: {
ReceivePaymentAdd: { "@onError": "continueOnError",
CustomerRef: { ReceivePaymentAddRq: {
FullName: ReceivePaymentAdd: {
payment.job.bodyshop.accountingconfig.tiers === 3 CustomerRef: {
? `${generateSourceTier(payment.job)}:${generateOwnerTier( FullName:
payment.job payment.job.bodyshop.accountingconfig.tiers === 3
)}:${generateJobTier(payment.job)}` ? `${generateSourceTier(payment.job)}:${generateOwnerTier(
: `${generateOwnerTier(payment.job)}:${generateJobTier( payment.job
payment.job )}:${generateJobTier(payment.job)}`
)}`, : `${generateOwnerTier(payment.job)}:${generateJobTier(
payment.job
)}`,
},
ARAccountRef: {
FullName:
payment.job.bodyshop.md_responsibility_centers.ar.accountname,
},
TxnDate: moment(payment.date).format("YYYY-MM-DD"), //Trim String
RefNumber:
payment.paymentnum || payment.stripeid || payment.transactionid,
TotalAmount: Dinero({
amount: Math.round(payment.amount * 100),
}).toFormat(DineroQbFormat),
PaymentMethodRef: {
FullName: payment.type,
},
Memo: `RO ${payment.job.ro_number || ""} OWNER ${
payment.job.ownr_fn || ""
} ${payment.job.ownr_ln || ""} ${payment.job.ownr_co_nm || ""} ${
payment.stripeid || ""
} ${payment.payer ? ` PAID BY ${payment.payer}` : ""}`,
IsAutoApply: true,
// AppliedToTxnAdd:{
// T
// }
}, },
ARAccountRef: {
FullName:
payment.job.bodyshop.md_responsibility_centers.ar.accountname,
},
TxnDate: moment(payment.date).format("YYYY-MM-DD"), //Trim String
RefNumber:
payment.paymentnum || payment.stripeid || payment.transactionid,
TotalAmount: Dinero({
amount: Math.round(payment.amount * 100),
}).toFormat(DineroQbFormat),
PaymentMethodRef: {
FullName: payment.type,
},
Memo: `RO ${payment.job.ro_number || ""} OWNER ${
payment.job.ownr_fn || ""
} ${payment.job.ownr_ln || ""} ${payment.job.ownr_co_nm || ""} ${
payment.stripeid || ""
} ${payment.payer ? ` PAID BY ${payment.payer}` : ""}`,
IsAutoApply: true,
// AppliedToTxnAdd:{
// T
// }
}, },
}, },
}, },
}, };
}; } else {
paymentQbxmlObj = {
QBXML: {
QBXMLMsgsRq: {
"@onError": "continueOnError",
CreditMemoAddRq: {
CreditMemoAdd: {
CustomerRef: {
FullName:
payment.job.bodyshop.accountingconfig.tiers === 3
? `${generateSourceTier(payment.job)}:${generateOwnerTier(
payment.job
)}:${generateJobTier(payment.job)}`
: `${generateOwnerTier(payment.job)}:${generateJobTier(
payment.job
)}`,
},
ARAccountRef: {
FullName:
payment.job.bodyshop.md_responsibility_centers.ar.accountname,
},
TxnDate: moment(payment.date).format("YYYY-MM-DD"), //Trim String
RefNumber:
payment.paymentnum || payment.stripeid || payment.transactionid,
CreditMemoLineAdd: [
{
ItemRef: {
FullName:
payment.job.bodyshop.md_responsibility_centers.refund
.accountitem,
},
Desc: payment.memo,
Amount: Dinero({
amount: Math.round(payment.amount * 100 * -1),
}).toFormat(DineroQbFormat),
SalesTaxCodeRef: { FullName: "E" },
},
],
},
},
},
},
};
}
var paymentQbxmlPartial = builder var paymentQbxmlPartial = builder
.create(paymentQbxmlObj, { .create(paymentQbxmlObj, {