BOD-63 added tax fields to form + schema for track tax on an item level

This commit is contained in:
Patrick Fic
2020-05-05 12:15:25 -07:00
parent 9238018022
commit 522dc07058
38 changed files with 963 additions and 9 deletions

View File

@@ -959,6 +959,69 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>invoice_federal_tax_rate</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>invoice_local_tax_rate</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>invoice_state_tax_rate</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>logo_img_path</name>
<definition_loaded>false</definition_loaded>
@@ -5074,6 +5137,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>federal_tax_rate</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>invoice_number</name>
<definition_loaded>false</definition_loaded>
@@ -5116,6 +5200,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>local_tax_rate</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>ro_number</name>
<definition_loaded>false</definition_loaded>
@@ -5137,6 +5242,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>state_tax_rate</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>total</name>
<definition_loaded>false</definition_loaded>

View File

@@ -3,7 +3,6 @@ import { Form } from "antd";
import moment from "moment";
import queryString from "query-string";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
@@ -19,7 +18,7 @@ const mapStateToProps = createStructuredSelector({
export function InvoiceDetailEditContainer({ bodyshop }) {
const search = queryString.parse(useLocation().search);
const { t } = useTranslation();
const [form] = Form.useForm();
const { loading, error, data } = useQuery(QUERY_INVOICE_BY_PK, {

View File

@@ -6,17 +6,23 @@ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { INSERT_NEW_INVOICE } from "../../graphql/invoices.queries";
import { toggleModalVisible } from "../../redux/modals/modals.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { selectInvoiceEnterModal } from "../../redux/modals/modals.selectors";
import InvoiceFormContainer from "../invoice-form/invoice-form.container";
const mapStateToProps = createStructuredSelector({
invoiceEnterModal: selectInvoiceEnterModal,
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
toggleModalVisible: () => dispatch(toggleModalVisible("invoiceEnter")),
});
function InvoiceEnterModalContainer({ invoiceEnterModal, toggleModalVisible }) {
function InvoiceEnterModalContainer({
invoiceEnterModal,
toggleModalVisible,
bodyshop,
}) {
const [form] = Form.useForm();
const { t } = useTranslation();
const [enterAgain, setEnterAgain] = useState(false);
@@ -113,6 +119,9 @@ function InvoiceEnterModalContainer({ invoiceEnterModal, toggleModalVisible }) {
(invoiceEnterModal.context.job &&
invoiceEnterModal.context.job.id) ||
null,
federal_tax_rate: bodyshop.invoice_tax_rates.federal_tax_rate || 0,
state_tax_rate: bodyshop.invoice_tax_rates.state_tax_rate || 0,
local_tax_rate: bodyshop.invoice_tax_rates.local_tax_rate || 0,
}}
>
<InvoiceFormContainer form={form} />

View File

@@ -6,6 +6,7 @@ import CurrencyInput from "../form-items-formatted/currency-form-item.component"
import JobSearchSelect from "../job-search-select/job-search-select.component";
import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component";
import InvoiceFormLines from "./invoice-form.lines.component";
import Dinero from "dinero.js";
export default function InvoiceFormComponent({
form,
@@ -107,6 +108,42 @@ export default function InvoiceFormComponent({
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("invoices.fields.federal_tax_rate")}
name="federal_tax_rate"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("invoices.fields.state_tax_rate")}
name="state_tax_rate"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<CurrencyInput />
</Form.Item>
<Form.Item
label={t("invoices.fields.local_tax_rate")}
name="local_tax_rate"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<CurrencyInput />
</Form.Item>
</div>
<InvoiceFormLines
lineData={lineData}
@@ -119,6 +156,16 @@ export default function InvoiceFormComponent({
<DocumentsUploadContainer jobId={form.getFieldValue("jobid")} />
</Form.Item>
<Form.Item shouldUpdate>
{() => {
return (
<div>
{JSON.stringify(form.getFieldsValue(["invoicelines", "total"]))}
</div>
);
}}
</Form.Item>
<button
onClick={() => {
console.log(form.getFieldsValue());

View File

@@ -1,5 +1,5 @@
import { DeleteFilled } from "@ant-design/icons";
import { Button, Form, Input, Select } from "antd";
import { Button, Form, Input, Select, Switch } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
@@ -59,7 +59,6 @@ export default function InvoiceEnterModalLinesComponent({
}}
/>
</Form.Item>
<Form.Item
label={t("invoicelines.fields.line_desc")}
key={`${index}line_desc`}
@@ -73,7 +72,6 @@ export default function InvoiceEnterModalLinesComponent({
>
<Input />
</Form.Item>
<Form.Item
label={t("invoicelines.fields.actual")}
key={`${index}actual_price`}
@@ -135,6 +133,31 @@ export default function InvoiceEnterModalLinesComponent({
))}
</Select>
</Form.Item>
<Form.Item
label={t("invoicelines.fields.federal_tax_applicable")}
key={`${index}fedtax`}
initialValue={"true"}
valuePropName="checked"
name={[field.name, "applicable_taxes", "federal"]}
>
<Switch />
</Form.Item>
<Form.Item
label={t("invoicelines.fields.state_tax_applicable")}
key={`${index}statetax`}
valuePropName="checked"
name={[field.name, "applicable_taxes", "state"]}
>
<Switch />
</Form.Item>{" "}
<Form.Item
label={t("invoicelines.fields.local_tax_applicable")}
key={`${index}localtax`}
valuePropName="checked"
name={[field.name, "applicable_taxes", "local"]}
>
<Switch />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);

View File

@@ -27,10 +27,10 @@ const InvoiceLineSearchSelect = ({
autoFocus
value={option}
style={{
width: 450,
width: 300,
}}
onChange={setOption}
optionFilterProp="children"
optionFilterProp="line_desc"
onBlur={onBlur}
onSelect={onSelect}
>

View File

@@ -1,5 +1,5 @@
import React from "react";
import { Form, Input, Button, Collapse } from "antd";
import { Form, Input, Button, Collapse, InputNumber } from "antd";
import { useTranslation } from "react-i18next";
import ShopInfoROStatusComponent from "./shop-info.rostatus.component";
import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component";
@@ -63,6 +63,24 @@ export default function ShopInfoComponent({ form }) {
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["invoice_tax_rates", "federal_tax_rate"]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_state_tax_rate")}
name={["invoice_tax_rates", "state_tax_rate"]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_local_tax_rate")}
name={["invoice_tax_rates", "local_tax_rate"]}
>
<InputNumber />
</Form.Item>
</Collapse.Panel>
<Collapse.Panel
key="roStatus"

View File

@@ -27,6 +27,7 @@ export const QUERY_BODYSHOP = gql`
template_header
textid
production_config
invoice_tax_rates
employees {
id
first_name
@@ -74,6 +75,7 @@ export const UPDATE_SHOP = gql`
template_header
textid
production_config
invoice_tax_rates
employees {
id
first_name

View File

@@ -102,6 +102,7 @@ export const QUERY_INVOICE_BY_PK = gql`
actual_cost
cost_center
joblineid
applicable_taxes
}
}
}

View File

@@ -80,6 +80,9 @@
"email": "General Shop Email",
"federal_tax_id": "Federal Tax ID (GST/HST)",
"insurance_vendor_id": "Insurance Vendor ID",
"invoice_federal_tax_rate": "Invoices - Federal Tax Rate %",
"invoice_local_tax_rate": "Invoices - State Tax Rate %",
"invoice_state_tax_rate": "Invoices - State Tax Rate %",
"logo_img_path": "Shop Logo",
"responsibilitycenter": "Responsibility Center",
"responsibilitycenters": {
@@ -357,9 +360,12 @@
},
"fields": {
"date": "Invoice Date",
"federal_tax_rate": "Federal Tax Rate",
"invoice_number": "Invoice Number",
"is_credit_memo": "Credit Memo?",
"local_tax_rate": "Local Tax Rate",
"ro_number": "RO Number",
"state_tax_rate": "State Tax Rate",
"total": "Invoice Total",
"vendor": "Vendor",
"vendorname": "Vendor Name"

View File

@@ -80,6 +80,9 @@
"email": "",
"federal_tax_id": "",
"insurance_vendor_id": "",
"invoice_federal_tax_rate": "",
"invoice_local_tax_rate": "",
"invoice_state_tax_rate": "",
"logo_img_path": "",
"responsibilitycenter": "",
"responsibilitycenters": {
@@ -357,9 +360,12 @@
},
"fields": {
"date": "",
"federal_tax_rate": "",
"invoice_number": "",
"is_credit_memo": "",
"local_tax_rate": "",
"ro_number": "",
"state_tax_rate": "",
"total": "",
"vendor": "",
"vendorname": ""

View File

@@ -80,6 +80,9 @@
"email": "",
"federal_tax_id": "",
"insurance_vendor_id": "",
"invoice_federal_tax_rate": "",
"invoice_local_tax_rate": "",
"invoice_state_tax_rate": "",
"logo_img_path": "",
"responsibilitycenter": "",
"responsibilitycenters": {
@@ -357,9 +360,12 @@
},
"fields": {
"date": "",
"federal_tax_rate": "",
"invoice_number": "",
"is_credit_memo": "",
"local_tax_rate": "",
"ro_number": "",
"state_tax_rate": "",
"total": "",
"vendor": "",
"vendorname": ""

View File

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

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."invoices" ADD COLUMN "federal_tax_rate" numeric NOT
NULL DEFAULT 0;
type: run_sql

View File

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

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."invoices" ADD COLUMN "state_tax_rate" numeric NOT NULL
DEFAULT 0;
type: run_sql

View File

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

View File

@@ -0,0 +1,6 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."invoices" ADD COLUMN "local_tax_rate" numeric NOT NULL
DEFAULT 0;
type: run_sql

View File

@@ -0,0 +1,40 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- vendorid
- jobid
- date
- due_date
- exported
- exported_at
- is_credit_memo
- total
- invoice_number
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoices
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,43 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- created_at
- date
- due_date
- exported
- exported_at
- federal_tax_rate
- id
- invoice_number
- is_credit_memo
- jobid
- local_tax_rate
- state_tax_rate
- total
- updated_at
- vendorid
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoices
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- exported
- is_credit_memo
- date
- due_date
- total
- invoice_number
- created_at
- exported_at
- updated_at
- id
- jobid
- vendorid
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: invoices
schema: public
type: create_select_permission

View File

@@ -0,0 +1,41 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- created_at
- date
- due_date
- exported
- exported_at
- federal_tax_rate
- id
- invoice_number
- is_credit_memo
- jobid
- local_tax_rate
- state_tax_rate
- total
- updated_at
- vendorid
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: invoices
schema: public
type: create_select_permission

View File

@@ -0,0 +1,40 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_update_permission
- args:
permission:
columns:
- exported
- is_credit_memo
- date
- due_date
- total
- invoice_number
- created_at
- exported_at
- updated_at
- id
- jobid
- vendorid
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoices
schema: public
type: create_update_permission

View File

@@ -0,0 +1,43 @@
- args:
role: user
table:
name: invoices
schema: public
type: drop_update_permission
- args:
permission:
columns:
- created_at
- date
- due_date
- exported
- exported_at
- federal_tax_rate
- id
- invoice_number
- is_credit_memo
- jobid
- local_tax_rate
- state_tax_rate
- total
- updated_at
- vendorid
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoices
schema: public
type: create_update_permission

View File

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

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "invoice_tax_rates" jsonb NULL;
type: run_sql

View File

@@ -0,0 +1,47 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- address1
- address2
- city
- country
- created_at
- email
- federal_tax_id
- id
- insurance_vendor_id
- logo_img_path
- md_order_statuses
- md_responsibility_centers
- md_ro_statuses
- messagingservicesid
- production_config
- region_config
- shopname
- shoprates
- state
- state_tax_id
- template_header
- textid
- updated_at
- 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,48 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- address1
- address2
- city
- country
- created_at
- email
- federal_tax_id
- id
- insurance_vendor_id
- invoice_tax_rates
- logo_img_path
- md_order_statuses
- md_responsibility_centers
- md_ro_statuses
- messagingservicesid
- production_config
- region_config
- shopname
- shoprates
- state
- state_tax_id
- template_header
- textid
- updated_at
- 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,45 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_update_permission
- args:
permission:
columns:
- address1
- address2
- city
- country
- created_at
- email
- federal_tax_id
- id
- insurance_vendor_id
- logo_img_path
- md_order_statuses
- md_responsibility_centers
- md_ro_statuses
- production_config
- shopname
- shoprates
- state
- state_tax_id
- updated_at
- zip_post
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: bodyshops
schema: public
type: create_update_permission

View File

@@ -0,0 +1,46 @@
- args:
role: user
table:
name: bodyshops
schema: public
type: drop_update_permission
- args:
permission:
columns:
- address1
- address2
- city
- country
- created_at
- email
- federal_tax_id
- id
- insurance_vendor_id
- invoice_tax_rates
- logo_img_path
- md_order_statuses
- md_responsibility_centers
- md_ro_statuses
- production_config
- shopname
- shoprates
- state
- state_tax_id
- updated_at
- zip_post
filter:
associations:
bodyshop:
associations:
user:
authid:
_eq: X-Hasura-User-Id
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: bodyshops
schema: public
type: create_update_permission

View File

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

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."invoicelines" ADD COLUMN "applicable_taxes" jsonb NULL;
type: run_sql

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_insert_permission
- args:
permission:
check:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- invoiceid
- line_desc
- actual_price
- actual_cost
- cost_center
- joblineid
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoicelines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,39 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_insert_permission
- args:
permission:
check:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- invoiceid
- joblineid
- line_desc
- updated_at
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoicelines
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,36 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- actual_cost
- actual_price
- cost_center
- line_desc
- created_at
- updated_at
- joblineid
- id
- invoiceid
computed_fields: []
filter:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: invoicelines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,37 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- invoiceid
- joblineid
- line_desc
- updated_at
computed_fields: []
filter:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: invoicelines
schema: public
type: create_select_permission

View File

@@ -0,0 +1,38 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_cost
- actual_price
- cost_center
- line_desc
- created_at
- updated_at
- joblineid
- id
- invoiceid
filter:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoicelines
schema: public
type: create_update_permission

View File

@@ -0,0 +1,39 @@
- args:
role: user
table:
name: invoicelines
schema: public
type: drop_update_permission
- args:
permission:
columns:
- actual_cost
- actual_price
- applicable_taxes
- cost_center
- created_at
- id
- invoiceid
- joblineid
- line_desc
- updated_at
filter:
invoice:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: invoicelines
schema: public
type: create_update_permission