IO-233 CDK updates.

This commit is contained in:
Patrick Fic
2021-12-02 10:50:11 -08:00
parent a77e664ab1
commit 39ec9d92ec
23 changed files with 688 additions and 201 deletions

View File

@@ -6491,6 +6491,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>pag</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>
<name>pal</name>
<definition_loaded>false</definition_loaded>
@@ -12146,6 +12167,37 @@
</folder_node>
</children>
</folder_node>
<folder_node>
<name>dms</name>
<children>
<folder_node>
<name>labels</name>
<children>
<concept_node>
<name>refreshallocations</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>
</children>
</folder_node>
</children>
</folder_node>
<folder_node>
<name>documents</name>
<children>
@@ -17809,6 +17861,32 @@
</translation>
</translations>
</concept_node>
<folder_node>
<name>labels</name>
<children>
<concept_node>
<name>refreshallocations</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>
</children>
</folder_node>
<concept_node>
<name>post</name>
<definition_loaded>false</definition_loaded>
@@ -18315,6 +18393,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>sendtodms</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>
<name>sync</name>
<definition_loaded>false</definition_loaded>
@@ -20419,6 +20518,27 @@
</concept_node>
</children>
</folder_node>
<concept_node>
<name>dms_allocation</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>
<name>driveable</name>
<definition_loaded>false</definition_loaded>
@@ -22151,6 +22271,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>po_number</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>
<name>policy_no</name>
<definition_loaded>false</definition_loaded>

View File

@@ -14,6 +14,7 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import CiecaSelect, { GetPartTypeName } from "../../utils/Ciecaselect";
import BillLineSearchSelect from "../bill-line-search-select/bill-line-search-select.component";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
@@ -72,11 +73,13 @@ export function BillEnterModalLinesComponent({
quantity: opt.part_qty || 1,
actual_price: opt.cost,
cost_center: opt.part_type
? responsibilityCenters.defaults &&
(responsibilityCenters.defaults.costs[
opt.part_type
] ||
null)
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? GetPartTypeName(opt.part_type)
: responsibilityCenters.defaults &&
(responsibilityCenters.defaults.costs[
opt.part_type
] ||
null)
: null,
};
}
@@ -224,6 +227,7 @@ export function BillEnterModalLinesComponent({
key: `${field.index}cost_center`,
name: [field.name, "cost_center"],
label: t("billlines.fields.cost_center"),
valuePropName: "value",
rules: [
{
required: true,
@@ -233,10 +237,12 @@ export function BillEnterModalLinesComponent({
};
},
formInput: (record, index) => (
<Select style={{ minWidth: "3rem" }} disabled={disabled}>
{responsibilityCenters.costs.map((item) => (
<Select.Option key={item.name}>{item.name}</Select.Option>
))}
<Select showSearch style={{ minWidth: "3rem" }} disabled={disabled}>
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
? CiecaSelect(true, false)
: responsibilityCenters.costs.map((item) => (
<Select.Option key={item.name}>{item.name}</Select.Option>
))}
</Select>
),
},

View File

@@ -95,6 +95,7 @@ export function DmsAllocationsSummary({ socket, bodyshop, jobId, title }) {
columns={columns}
rowKey="center"
dataSource={allocationsSummary}
locale={{ emptyText: t("dms.labels.refreshallocations") }}
summary={() => {
const totals = allocationsSummary.reduce(
(acc, val) => {

View File

@@ -221,7 +221,47 @@ export function DmsPostForm({ bodyshop, socket, job }) {
</Form.Item>
<Form.Item
label={t("jobs.fields.dms.payer.controlnumber")}
label={
<div>
{t("jobs.fields.dms.payer.controlnumber")}{" "}
<Dropdown
overlay={
<Menu>
{bodyshop.cdk_configuration.controllist &&
bodyshop.cdk_configuration.controllist.map(
(key, idx) => (
<Menu.Item
key={idx}
onClick={() => {
form.setFieldsValue({
payers: form
.getFieldValue("payers")
.map((row, mapIndex) => {
if (index !== mapIndex)
return row;
return {
...row,
controlnumber:
key.controlnumber,
};
}),
});
}}
>
{key.name}
</Menu.Item>
)
)}
</Menu>
}
>
<a href=" #" onClick={(e) => e.preventDefault()}>
<DownOutlined />
</a>
</Dropdown>
</div>
}
key={`${index}controlnumber`}
name={[field.name, "controlnumber"]}
rules={[
@@ -254,42 +294,6 @@ export function DmsPostForm({ bodyshop, socket, job }) {
}}
</Form.Item>
<Dropdown
overlay={
<Menu>
{bodyshop.cdk_configuration.controllist &&
bodyshop.cdk_configuration.controllist.map(
(key, idx) => (
<Menu.Item
key={idx}
onClick={() => {
form.setFieldsValue({
payers: form
.getFieldValue("payers")
.map((row, mapIndex) => {
if (index !== mapIndex) return row;
return {
...row,
controlnumber: key.controlnumber,
};
}),
});
}}
>
{key.name}
</Menu.Item>
)
)}
</Menu>
}
>
<a href=" #" onClick={(e) => e.preventDefault()}>
{t("bodyshop.labels.dms.cdk.controllist")}{" "}
<DownOutlined />
</a>
</Dropdown>
<DeleteFilled
onClick={() => {
remove(field.name);

View File

@@ -54,6 +54,7 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
const handleMenuClick = ({ item, key, keyPath, domEvent }) => {
logImEXEvent("jobs_close_allocate_auto_dms");
form.setFieldsValue({ dms_allocation: key });
handleAllocate(
bodyshop.md_responsibility_centers.dms_defaults.find(
(x) => x.name === key
@@ -64,7 +65,9 @@ export function JobsCloseAutoAllocate({ bodyshop, joblines, form, disabled }) {
const overlay = (bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
<Menu onClick={handleMenuClick}>
{bodyshop.md_responsibility_centers.dms_defaults.map((mapping) => (
<Menu.Item key={mapping.name}>{mapping.name}</Menu.Item>
<Menu.Item disabled={disabled} key={mapping.name}>
{mapping.name}
</Menu.Item>
))}
</Menu>
);

View File

@@ -38,12 +38,7 @@ export function LaborAllocationsTable({
useEffect(() => {
if (!!joblines && !!timetickets && !!bodyshop);
setTotals(
CalculateAllocationsTotals(
bodyshop.md_responsibility_centers,
joblines,
timetickets,
adjustments
)
CalculateAllocationsTotals(bodyshop, joblines, timetickets, adjustments)
);
if (!jobId) setTotals([]);
}, [joblines, timetickets, bodyshop, adjustments, jobId]);

View File

@@ -1,9 +1,12 @@
import i18next from "i18next";
export const CalculateAllocationsTotals = (
responsibilitycenters,
bodyshop,
joblines,
timetickets,
adjustments = []
) => {
const responsibilitycenters = bodyshop.md_responsibility_centers;
const jobCodes = joblines.map((item) => item.mod_lbr_ty);
//.filter((value, index, self) => self.indexOf(value) === index && !!value);
const ticketCodes = timetickets.map((item) => item.ciecacode);
@@ -15,7 +18,12 @@ export const CalculateAllocationsTotals = (
const r = allCodes.reduce((acc, value) => {
const r = {
opcode: value,
cost_center: responsibilitycenters.defaults.costs[value],
cost_center:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
? i18next.t(
`joblines.fields.lbr_types.${value && value.toUpperCase()}`
)
: responsibilitycenters.defaults.costs[value],
mod_lbr_ty: value,
total: joblines.reduce((acc2, val2) => {
return val2.mod_lbr_ty === value ? acc2 + val2.mod_lb_hrs : acc2;

View File

@@ -23,6 +23,7 @@ import { DELETE_PARTS_ORDER } from "../../graphql/parts-orders.queries";
import { selectJobReadOnly } from "../../redux/application/application.selectors";
import { setModalContext } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { GetPartTypeName } from "../../utils/Ciecaselect";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
@@ -165,10 +166,15 @@ export function PartsOrderListTableComponent({
quantity: pol.quantity,
actual_price: pol.act_price,
cost_center: pol.jobline?.part_type
? responsibilityCenters.defaults.costs[
pol.jobline.part_type
] || null
? bodyshop.pbs_serialnumber || bodyshop.cdk_dealerid
? GetPartTypeName(pol.jobline.part_type)
: responsibilityCenters.defaults &&
(responsibilityCenters.defaults.costs[
pol.jobline.part_type
] ||
null)
: null,
};
}),

View File

@@ -14,6 +14,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import FormDatePicker from "../form-date-picker/form-date-picker.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import CiecaSelect from "../../utils/Ciecaselect";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -218,6 +219,7 @@ export function ShopEmployeesFormComponent({
label={t("employees.fields.cost_center")}
key={`${index}`}
name={[field.name, "cost_center"]}
valuePropName="value"
rules={[
{
required: true,
@@ -232,11 +234,16 @@ export function ShopEmployeesFormComponent({
>
{t("timetickets.labels.shift")}
</Select.Option>
{bodyshop.md_responsibility_centers.costs.map((c) => (
<Select.Option key={c.name} value={c.name}>
{c.name}
</Select.Option>
))}
{bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
? CiecaSelect(false, true)
: bodyshop.md_responsibility_centers.costs.map(
(c) => (
<Select.Option key={c.name} value={c.name}>
{c.name}
</Select.Option>
)
)}
</Select>
</Form.Item>
<Form.Item

View File

@@ -47,9 +47,13 @@ export function TimeTicketModalComponent({
>
{emps &&
emps.rates.map((item) => (
<Select.Option key={item.cost_center}>
<Select.Option key={item.cost_center} value={item.cost_center}>
{item.cost_center === "timetickets.labels.shift"
? t(item.cost_center)
: bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
? t(
`joblines.fields.lbr_types.${item.cost_center.toUpperCase()}`
)
: item.cost_center}
</Select.Option>
))}
@@ -137,6 +141,7 @@ export function TimeTicketModalComponent({
<Form.Item
name="cost_center"
label={t("timetickets.fields.cost_center")}
valuePropName="value"
rules={[
{
required: true,

View File

@@ -143,13 +143,16 @@ export function TimeTicketModalContainer({
}
if (!!changedFields.cost_center && !!EmployeeAutoCompleteData) {
form.setFieldsValue({
ciecacode: Object.keys(
bodyshop.md_responsibility_centers.defaults.costs
).find(
(key) =>
bodyshop.md_responsibility_centers.defaults.costs[key] ===
changedFields.cost_center
),
ciecacode:
bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber
? changedFields.cost_center
: Object.keys(
bodyshop.md_responsibility_centers.defaults.costs
).find(
(key) =>
bodyshop.md_responsibility_centers.defaults.costs[key] ===
changedFields.cost_center
),
});
}
};

View File

@@ -1695,6 +1695,7 @@ export const QUERY_JOB_CLOSE_DETAILS = gql`
ro_number
invoice_allocation
ins_co_id
dms_allocation
id
ded_amt
ded_status

View File

@@ -9,6 +9,7 @@ import {
Divider,
PageHeader,
InputNumber,
Input,
} from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -26,6 +27,8 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import LayoutFormRow from "../../components/layout-form-row/layout-form-row.component";
import DateTimePicker from "../../components/form-date-time-picker/form-date-time-picker.component";
import moment from "moment";
import { Link } from "react-router-dom";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
jobRO: selectJobReadOnly,
@@ -59,6 +62,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
actual_delivery: values.actual_delivery,
kmin: values.kmin,
kmout: values.kmout,
dms_allocation: values.dms_allocation,
},
},
refetchQueries: ["QUERY_JOB_CLOSE_DETAILS"],
@@ -117,6 +121,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
: job.scheduled_delivery && moment(job.scheduled_delivery),
kmin: job.kmin,
kmout: job.kmout,
dms_allocation: job.dms_allocation,
}}
scrollToFirstError
>
@@ -141,7 +146,11 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
{t("general.actions.close")}
</Button>
</Popconfirm>
<Link to={`/manage/dms?jobId=${job.id}`}>
<Button disabled={job.date_exported || !jobRO}>
{t("jobs.actions.sendtodms")}
</Button>
</Link>
<JobsScoreboardAdd job={job} disabled={false} />
</Space>
}
@@ -247,6 +256,19 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
<InputNumber precision={0} disabled={jobRO} />
</Form.Item>
)}
{(bodyshop.cdk_dealerid || bodyshop.pbs_serialnumber) && (
<Form.Item
label={t("jobs.fields.dms_allocation")}
name="dms_allocation"
rules={[
{
required: true,
},
]}
>
<Input disabled />
</Form.Item>
)}
</LayoutFormRow>
<Divider />
<JobsCloseLines job={job} />

View File

@@ -413,6 +413,7 @@
"mash": "Shop Materials",
"paa": "Aftermarket",
"pac": "Chrome",
"pag": "Glass",
"pal": "LKQ",
"pam": "Remanufactured",
"pan": "OEM",
@@ -759,6 +760,11 @@
"projectedmonthlysales": "Projected Monthly Sales"
}
},
"dms": {
"labels": {
"refreshallocations": "Refresh to see DMS Allocataions."
}
},
"documents": {
"actions": {
"delete": "Delete Selected Documents",
@@ -1107,6 +1113,9 @@
"createnewcustomer": "Create New Customer",
"findmakemodelcode": "Find Make/Model Code",
"getmakes": "",
"labels": {
"refreshallocations": "Refresh this component to see the DMS allocations."
},
"post": "Post",
"refetchmakesmodels": "Refetch Make and Model Codes",
"usegeneric": "Use Generic Customer",
@@ -1132,6 +1141,7 @@
"removefromproduction": "Remove from Production",
"schedule": "Schedule",
"sendcsi": "Send CSI",
"sendtodms": "Send to DMS",
"sync": "Sync",
"uninvoice": "Uninvoice",
"unvoid": "Unvoid Job",
@@ -1241,6 +1251,7 @@
"story": "Story",
"vinowner": "VIN Owner"
},
"dms_allocation": "DMS Allocation",
"driveable": "Driveable",
"employee_body": "Body",
"employee_csr": "Customer Service Rep.",
@@ -1327,6 +1338,7 @@
"pas": "Sublet",
"pay_date": "Pay Date",
"phoneshort": "PH",
"po_number": "PO Number",
"policy_no": "Policy #",
"ponumber": "PO Number",
"production_vars": {

View File

@@ -413,6 +413,7 @@
"mash": "",
"paa": "",
"pac": "",
"pag": "",
"pal": "",
"pam": "",
"pan": "",
@@ -759,6 +760,11 @@
"projectedmonthlysales": ""
}
},
"dms": {
"labels": {
"refreshallocations": ""
}
},
"documents": {
"actions": {
"delete": "",
@@ -1107,6 +1113,9 @@
"createnewcustomer": "",
"findmakemodelcode": "",
"getmakes": "",
"labels": {
"refreshallocations": ""
},
"post": "",
"refetchmakesmodels": "",
"usegeneric": "",
@@ -1132,6 +1141,7 @@
"removefromproduction": "",
"schedule": "Programar",
"sendcsi": "",
"sendtodms": "",
"sync": "",
"uninvoice": "",
"unvoid": "",
@@ -1241,6 +1251,7 @@
"story": "",
"vinowner": ""
},
"dms_allocation": "",
"driveable": "",
"employee_body": "",
"employee_csr": "Representante de servicio al cliente.",
@@ -1327,6 +1338,7 @@
"pas": "",
"pay_date": "Fecha de Pay",
"phoneshort": "PH",
"po_number": "",
"policy_no": "Política #",
"ponumber": "numero postal",
"production_vars": {

View File

@@ -413,6 +413,7 @@
"mash": "",
"paa": "",
"pac": "",
"pag": "",
"pal": "",
"pam": "",
"pan": "",
@@ -759,6 +760,11 @@
"projectedmonthlysales": ""
}
},
"dms": {
"labels": {
"refreshallocations": ""
}
},
"documents": {
"actions": {
"delete": "",
@@ -1107,6 +1113,9 @@
"createnewcustomer": "",
"findmakemodelcode": "",
"getmakes": "",
"labels": {
"refreshallocations": ""
},
"post": "",
"refetchmakesmodels": "",
"usegeneric": "",
@@ -1132,6 +1141,7 @@
"removefromproduction": "",
"schedule": "Programme",
"sendcsi": "",
"sendtodms": "",
"sync": "",
"uninvoice": "",
"unvoid": "",
@@ -1241,6 +1251,7 @@
"story": "",
"vinowner": ""
},
"dms_allocation": "",
"driveable": "",
"employee_body": "",
"employee_csr": "représentant du service à la clientèle",
@@ -1327,6 +1338,7 @@
"pas": "",
"pay_date": "Date d'Pay",
"phoneshort": "PH",
"po_number": "",
"policy_no": "Politique #",
"ponumber": "Numéro de bon de commande",
"production_vars": {

View File

@@ -0,0 +1,103 @@
import React from "react";
import { Select } from "antd";
import i18n from "../translations/i18n";
export default function CiecaSelect(parts = true, labor = true) {
return (
<>
{labor && (
<>
<Select.Option value="LAA">
{i18n.t("joblines.fields.lbr_types.LAA")}
</Select.Option>
<Select.Option value="LAB">
{i18n.t("joblines.fields.lbr_types.LAB")}
</Select.Option>
<Select.Option value="LAD">
{i18n.t("joblines.fields.lbr_types.LAD")}
</Select.Option>
<Select.Option value="LAE">
{i18n.t("joblines.fields.lbr_types.LAE")}
</Select.Option>
<Select.Option value="LAF">
{i18n.t("joblines.fields.lbr_types.LAF")}
</Select.Option>
<Select.Option value="LAG">
{i18n.t("joblines.fields.lbr_types.LAG")}
</Select.Option>
<Select.Option value="LAM">
{i18n.t("joblines.fields.lbr_types.LAM")}
</Select.Option>
<Select.Option value="LAR">
{i18n.t("joblines.fields.lbr_types.LAR")}
</Select.Option>
<Select.Option value="LAS">
{i18n.t("joblines.fields.lbr_types.LAS")}
</Select.Option>
<Select.Option value="LAU">
{i18n.t("joblines.fields.lbr_types.LAU")}
</Select.Option>
<Select.Option value="LA1">
{i18n.t("joblines.fields.lbr_types.LA1")}
</Select.Option>
<Select.Option value="LA2">
{i18n.t("joblines.fields.lbr_types.LA2")}
</Select.Option>
<Select.Option value="LA3">
{i18n.t("joblines.fields.lbr_types.LA3")}
</Select.Option>
<Select.Option value="LA4">
{i18n.t("joblines.fields.lbr_types.LA4")}
</Select.Option>
</>
)}
{parts && (
<>
<Select.Option value="PAA">
{i18n.t("joblines.fields.part_types.PAA")}
</Select.Option>
<Select.Option value="PAC">
{i18n.t("joblines.fields.part_types.PAC")}
</Select.Option>
<Select.Option value="PAL">
{i18n.t("joblines.fields.part_types.PAL")}
</Select.Option>
<Select.Option value="PAG">
{i18n.t("joblines.fields.part_types.PAG")}
</Select.Option>
<Select.Option value="PAM">
{i18n.t("joblines.fields.part_types.PAM")}
</Select.Option>
<Select.Option value="PAP">
{i18n.t("joblines.fields.part_types.PAP")}
</Select.Option>
<Select.Option value="PAN">
{i18n.t("joblines.fields.part_types.PAN")}
</Select.Option>
<Select.Option value="PAO">
{i18n.t("joblines.fields.part_types.PAO")}
</Select.Option>
<Select.Option value="PAR">
{i18n.t("joblines.fields.part_types.PAR")}
</Select.Option>
<Select.Option value="PAS">
{i18n.t("joblines.fields.part_types.PAS")}
</Select.Option>
</>
)}
</>
);
}
export function GetPartTypeName(part_type) {
console.log(part_type);
if (!part_type) return null;
return i18n.t(`joblines.fields.part_types.${part_type.toUpperCase()}`);
}
export function Get(part_type) {
console.log(part_type);
if (!part_type) return null;
return i18n.t(`joblines.fields.part_types.${part_type.toUpperCase()}`);
}

View File

@@ -2616,6 +2616,7 @@
- ded_status
- deliverchecklist
- depreciation_taxes
- dms_allocation
- driveable
- employee_body
- employee_csr
@@ -2868,6 +2869,7 @@
- ded_status
- deliverchecklist
- depreciation_taxes
- dms_allocation
- driveable
- employee_body
- employee_csr
@@ -3130,6 +3132,7 @@
- ded_status
- deliverchecklist
- depreciation_taxes
- dms_allocation
- driveable
- employee_body
- employee_csr

View File

@@ -0,0 +1,4 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."jobs" add column "dms_allocation" text
-- null;

View File

@@ -0,0 +1,2 @@
alter table "public"."jobs" add column "dms_allocation" text
null;

View File

@@ -106,10 +106,23 @@ exports.default = async function (socket, jobid) {
return acc;
}, {});
const selectedDmsAllocationConfig =
bodyshop.md_responsibility_centers.dms_defaults.find(
(d) => d.name === job.dms_allocation
);
CdkBase.createLogEvent(
socket,
"DEBUG",
`Using DMS Allocation ${
selectedDmsAllocationConfig && selectedDmsAllocationConfig.name
} for cost export.`
);
const costCenterHash = job.bills.reduce((bill_acc, bill_val) => {
bill_val.billlines.map((line_val) => {
if (!bill_acc[line_val.cost_center])
bill_acc[line_val.cost_center] = Dinero();
if (!bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]])
bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] =
Dinero();
let lineDinero = Dinero({
amount: Math.round((line_val.actual_cost || 0) * 100),
@@ -117,8 +130,10 @@ exports.default = async function (socket, jobid) {
.multiply(line_val.quantity)
.multiply(bill_val.is_credit_memo ? -1 : 1);
bill_acc[line_val.cost_center] =
bill_acc[line_val.cost_center].add(lineDinero);
bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]] =
bill_acc[selectedDmsAllocationConfig.costs[line_val.cost_center]].add(
lineDinero
);
return null;
});
return bill_acc;
@@ -136,17 +151,19 @@ exports.default = async function (socket, jobid) {
),
});
//Add it to the right cost center.
if (!costCenterHash[ticket.cost_center])
costCenterHash[ticket.cost_center] = Dinero();
if (!costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]])
costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] =
Dinero();
costCenterHash[ticket.cost_center] =
costCenterHash[ticket.cost_center].add(TicketTotal);
costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]] =
costCenterHash[selectedDmsAllocationConfig.costs[ticket.ciecacode]].add(
TicketTotal
);
});
if (!hasMapaLine && job.job_totals.rates.mapa.total.amount > 0) {
// console.log("Adding MAPA Line Manually.");
const mapaAccountName =
bodyshop.md_responsibility_centers.defaults.profits.MAPA;
const mapaAccountName = selectedDmsAllocationConfig.profits.MAPA;
const mapaAccount = bodyshop.md_responsibility_centers.profits.find(
(c) => c.name === mapaAccountName
@@ -167,8 +184,7 @@ exports.default = async function (socket, jobid) {
if (!hasMashLine && job.job_totals.rates.mash.total.amount > 0) {
// console.log("Adding MASH Line Manually.");
const mashAccountName =
bodyshop.md_responsibility_centers.defaults.profits.MASH;
const mashAccountName = selectedDmsAllocationConfig.profits.MASH;
const mashAccount = bodyshop.md_responsibility_centers.profits.find(
(c) => c.name === mashAccountName
@@ -198,7 +214,7 @@ exports.default = async function (socket, jobid) {
if (job.towing_payable && job.towing_payable !== 0) {
const towAccountName =
bodyshop.md_responsibility_centers.defaults.profits.TOW;
selectedDmsAllocationConfig.profits.TOW;
const towAccount = bodyshop.md_responsibility_centers.profits.find(
(c) => c.name === towAccountName
@@ -219,7 +235,7 @@ exports.default = async function (socket, jobid) {
}
if (job.storage_payable && job.storage_payable !== 0) {
const storageAccountName =
bodyshop.md_responsibility_centers.defaults.profits.TOW;
selectedDmsAllocationConfig.profits.TOW;
const towAccount = bodyshop.md_responsibility_centers.profits.find(
(c) => c.name === storageAccountName
@@ -243,7 +259,7 @@ exports.default = async function (socket, jobid) {
if (job.adjustment_bottom_line && job.adjustment_bottom_line !== 0) {
const otherAccountName =
bodyshop.md_responsibility_centers.defaults.profits.PAO;
selectedDmsAllocationConfig.profits.PAO;
const otherAccount = bodyshop.md_responsibility_centers.profits.find(
(c) => c.name === otherAccountName

View File

@@ -253,6 +253,7 @@ query QUERY_JOBS_FOR_PBS_EXPORT($id: uuid!) {
ro_number
clm_total
clm_no
dms_allocation
invoice_allocation
ownerid
ownr_ln
@@ -1200,6 +1201,7 @@ exports.GET_CDK_ALLOCATIONS = `query QUERY_JOB_CLOSE_DETAILS($id: uuid!) {
cdk_configuration
}
ro_number
dms_allocation
invoice_allocation
ins_co_id
id
@@ -1261,6 +1263,7 @@ exports.GET_CDK_ALLOCATIONS = `query QUERY_JOB_CLOSE_DETAILS($id: uuid!) {
cost_center
productivehrs
rate
ciecacode
employee {
flat_rate
}