Added conversion logic for ROs. Blanket translations for files.

This commit is contained in:
Patrick Fic
2020-01-14 11:58:37 -08:00
parent bee4f630c4
commit e4693685fe
29 changed files with 2783 additions and 185 deletions

1476
bodyshop_translations.babel Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@ import {
Avatar, Avatar,
Layout Layout
} from "antd"; } from "antd";
import { UPDATE_JOB } from "../../graphql/jobs.queries"; import { UPDATE_JOB, CONVERT_JOB_TO_RO } from "../../graphql/jobs.queries";
import { useMutation } from "@apollo/react-hooks"; import { useMutation } from "@apollo/react-hooks";
import FormItemPhone from "../form-items-formatted/phone-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@@ -36,6 +36,7 @@ const formItemLayout = {
function JobTombstone({ job, ...otherProps }) { function JobTombstone({ job, ...otherProps }) {
const [jobContext, setJobContext] = useState(job); const [jobContext, setJobContext] = useState(job);
const [mutationUpdateJob] = useMutation(UPDATE_JOB); const [mutationUpdateJob] = useMutation(UPDATE_JOB);
const [mutationConvertJob] = useMutation(CONVERT_JOB_TO_RO);
const { t } = useTranslation(); const { t } = useTranslation();
if (!job) { if (!job) {
@@ -95,11 +96,31 @@ function JobTombstone({ job, ...otherProps }) {
} }
tags={<Tag color='blue'>{jobContext?.job_status?.name}</Tag>} tags={<Tag color='blue'>{jobContext?.job_status?.name}</Tag>}
extra={[ extra={[
<Form.Item key='1'> <Button
<Button type='primary' htmlType='submit'> key='convert'
{t("general.labels.save")} type='dashed'
</Button> disabled={!jobContext.converted}
</Form.Item> onClick={() => {
mutationConvertJob({
variables: { jobId: jobContext.id }
}).then(r => {
console.log("r", r);
setJobContext({
...jobContext,
converted: true,
ro_number: r.data.update_jobs.returning[0].ro_number
});
notification["success"]({
message: t("jobs.successes.converted")
});
});
}}>
{t("jobs.labels.convert")}
</Button>,
<Button type='primary' key='submit' htmlType='submit'>
{t("general.labels.save")}
</Button>
]}> ]}>
<Descriptions size='small' column={5}> <Descriptions size='small' column={5}>
<Descriptions.Item label={t("jobs.fields.vehicle")}> <Descriptions.Item label={t("jobs.fields.vehicle")}>

View File

@@ -9,55 +9,56 @@ const errorLink = onError(
console.log("networkError", networkError); console.log("networkError", networkError);
console.log("operation", operation); console.log("operation", operation);
console.log("forward", forward); console.log("forward", forward);
//if (graphQLErrors) { if (graphQLErrors) {
// User access token has expired //User access token has expired
if (networkError.message.includes("JWTExpired")) { console.log("graphQLErrors", graphQLErrors);
console.log("Got to the error check.");
if (access_token && access_token !== "undefined") {
// Let's refresh token through async request
return new Observable(observer => {
auth.currentUser
.getIdToken(true)
.then(function(idToken) {
if (!idToken) {
window.localStorage.removeItem("token");
return console.log("Refresh token has expired");
}
console.log("Got a new token", idToken);
window.localStorage.setItem("token", idToken);
// reset the headers
operation.setContext(({ headers = {} }) => ({
headers: {
// Re-add old headers
...headers,
// Switch out old access token for new one
authorization: idToken ? `Bearer ${idToken}` : ""
}
}));
// const subscriber = {
// next: observer.next.bind(observer),
// error: observer.error.bind(observer),
// complete: observer.complete.bind(observer)
// };
console.log("About to resend the request.");
// Retry last failed request
forward(operation); //.subscribe(subscriber);
})
.catch(error => {
// No refresh or client token available, we force user to login
console.log("Hit an error.");
observer.error(error);
});
});
}
} }
//}
if (networkError) { if (networkError) {
console.log(`[Network error]: ${networkError}`); console.log(`[Network error]: ${networkError}`);
//props.history.push("/network-error"); //props.history.push("/network-error");
if (networkError.message.includes("JWTExpired")) {
console.log("Got to the error check.");
if (access_token && access_token !== "undefined") {
// Let's refresh token through async request
return new Observable(observer => {
auth.currentUser
.getIdToken(true)
.then(function(idToken) {
if (!idToken) {
window.localStorage.removeItem("token");
return console.log("Refresh token has expired");
}
console.log("Got a new token", idToken);
window.localStorage.setItem("token", idToken);
// reset the headers
operation.setContext(({ headers = {} }) => ({
headers: {
// Re-add old headers
...headers,
// Switch out old access token for new one
authorization: idToken ? `Bearer ${idToken}` : ""
}
}));
// const subscriber = {
// next: observer.next.bind(observer),
// error: observer.error.bind(observer),
// complete: observer.complete.bind(observer)
// };
console.log("About to resend the request.");
// Retry last failed request
forward(operation); //.subscribe(subscriber);
})
.catch(error => {
// No refresh or client token available, we force user to login
console.log("Hit an error.");
observer.error(error);
});
});
}
}
} }
} }
); );

View File

@@ -272,3 +272,15 @@ export const UPDATE_JOB = gql`
} }
} }
`; `;
export const CONVERT_JOB_TO_RO = gql`
mutation CONVERT_JOB_TO_RO($jobId: uuid!) {
update_jobs(where: { id: { _eq: $jobId } }, _set: { converted: true }) {
returning {
id
ro_number
converted
}
}
}
`;

View File

@@ -1,110 +1,108 @@
{ {
"translation": { "translation": {
"general": { "general": {
"languages": { "labels": {
"english": "English", "in": "In",
"french": "French", "loading": "Loading...",
"spanish": "Spanish" "na": "N/A",
}, "out": "Out",
"labels": { "save": "Save",
"in": "In", "unknown": "Unknown"
"out": "Out", },
"na": "N/A", "languages": {
"unknown": "Unknown", "english": "English",
"save": "Save", "french": "French",
"loading": "Loading..." "spanish": "Spanish"
} }
}, },
"menus": { "jobs": {
"currentuser": { "actions": {
"profile": "Profile", "addDocuments": "Add Job Documents",
"languageselector": "Language" "addNote": "Add Note",
}, "postInvoices": "Post Invoices",
"profilesidebar": { "printCenter": "Print Center"
"profile": "My Profile", },
"shops": "My Shops" "errors": {
} "noaccess": "This job does not exist or you do not have access to it.",
}, "nojobselected": "No job is selected.",
"noowner": "No owner associated.",
"titles": { "novehicle": "No vehicle associated.",
"app": "Bodyshop by ImEX Systems", "saving": "Error encountered while saving record.",
"jobs": "All Jobs | $t(titles.app)", "validation": "Please ensure all fields are entered correctly.",
"jobsdetail": "Job {{ro_number}} | $t(titles.app)", "validationtitle": "Validation Error"
"profile": "My Profile | $t(titles.app)" },
}, "fields": {
"claim_total": "Claim Total",
"profile": { "clm_no": "Claim #",
"errors": { "clm_total": "Claim Total",
"state": "Error reading page state. Please refresh." "deductible": "Deductible",
} "est_number": "Estimate Number",
}, "owner": "Owner",
"owner_owing": "Cust. Owes",
"vehicles": { "phone1": "Phone 1",
"fields": { "ro_number": "RO #",
"plate_no": "License Plate" "status": "Job Status",
} "vehicle": "Vehicle"
}, },
"labels": {
"notes": { "cards": {
"labels": { "appraiser": "Appraiser",
"newnoteplaceholder": "Add a note..." "customer": "Customer Information",
}, "damage": "Area of Damage",
"fields": { "dates": "Dates",
"critical": "Critical", "documents": "Documents",
"private": "Private", "estimator": "Estimator",
"text": "Contents" "filehandler": "File Handler",
} "insurance": "Insurance Details",
}, "notes": "Notes",
"parts": "Parts",
"jobs": { "totals": "Totals",
"labels": { "vehicle": "Vehicle"
"cards": { },
"customer": "Customer Information", "convert": "Convert",
"vehicle": "Vehicle", "vehicle_info": "Vehicle"
"insurance": "Insurance Details", },
"dates": "Dates", "successes": {
"documents": "Documents", "converted": "Job converted successfully.",
"parts": "Parts", "save": "Record Saved",
"notes": "Notes", "savetitle": "Record saved successfully."
"damage": "Area of Damage", }
"totals": "Totals", },
"filehandler": "File Handler", "menus": {
"appraiser": "Appraiser", "currentuser": {
"estimator": "Estimator" "languageselector": "Language",
}, "profile": "Profile"
"vehicle_info": "Vehicle" },
}, "profilesidebar": {
"fields": { "profile": "My Profile",
"ro_number": "RO #", "shops": "My Shops"
"est_number": "Estimate Number", }
"clm_total": "Claim Total", },
"deductible": "Deductible", "notes": {
"owner": "Owner", "fields": {
"status": "Job Status", "critical": "Critical",
"vehicle": "Vehicle", "private": "Private",
"phone1": "Phone 1", "text": "Contents"
"clm_no": "Claim #", },
"owner_owing": "Cust. Owes" "labels": {
}, "newnoteplaceholder": "Add a note..."
"successes": { }
"save": "Record Saved", },
"savetitle": "Record saved succesfully." "profile": {
}, "errors": {
"errors": { "state": "Error reading page state. Please refresh."
"noaccess": "This job does not exist or you do not have access to it.", }
"validationtitle": "Validation Error", },
"validation": "Please ensure all fields are entered correctly.", "titles": {
"saving": "Error encountered while saving record.", "app": "Bodyshop by ImEX Systems",
"nojobselected": "No job is selected.", "jobs": "All Jobs | $t(titles.app)",
"noowner": "No owner associated.", "jobsdetail": "Job {{ro_number}} | $t(titles.app)",
"novehicle": "No vehicle associated." "profile": "My Profile | $t(titles.app)"
}, },
"actions": { "vehicles": {
"addDocuments": "Add Job Documents", "fields": {
"printCenter": "Print Center", "plate_no": "License Plate"
"postInvoices": "Post Invoices", }
"addNote": "Add Note" }
} }
}
}
} }

View File

@@ -1,9 +1,108 @@
{ {
"translation": { "translation": {
"general": { "general": {
"title": "Hola a {{framework}}", "labels": {
"greetings": "Hola!", "in": "en",
"intro": "To get started, edit <1><0></0></1> and save to reload." "loading": "Cargando...",
} "na": "N / A",
} "out": "Afuera",
"save": "Salvar",
"unknown": "Desconocido"
},
"languages": {
"english": "Inglés",
"french": "francés",
"spanish": "español"
}
},
"jobs": {
"actions": {
"addDocuments": "Agregar documentos de trabajo",
"addNote": "Añadir la nota",
"postInvoices": "Contabilizar facturas",
"printCenter": "Centro de impresión"
},
"errors": {
"noaccess": "Este trabajo no existe o no tiene acceso a él.",
"nojobselected": "No hay trabajo seleccionado.",
"noowner": "Ningún propietario asociado.",
"novehicle": "No hay vehículo asociado.",
"saving": "Se encontró un error al guardar el registro.",
"validation": "Asegúrese de que todos los campos se ingresen correctamente.",
"validationtitle": "Error de validacion"
},
"fields": {
"claim_total": "Reclamar total",
"clm_no": "Reclamación #",
"clm_total": "Reclamar total",
"deductible": "Deducible",
"est_number": "Numero Estimado",
"owner": "Propietario",
"owner_owing": "Cust. Debe",
"phone1": "Teléfono 1",
"ro_number": "RO #",
"status": "Estado del trabajo",
"vehicle": "Vehículo"
},
"labels": {
"cards": {
"appraiser": "Tasador",
"customer": "Información al cliente",
"damage": "Área de Daño",
"dates": "fechas",
"documents": "documentos",
"estimator": "Estimador",
"filehandler": "File Handler",
"insurance": "detalles del seguro",
"notes": "Notas",
"parts": "Partes",
"totals": "Totales",
"vehicle": "Vehículo"
},
"convert": "Convertir",
"vehicle_info": "Vehículo"
},
"successes": {
"converted": "Trabajo convertido con éxito.",
"save": "Registro guardado",
"savetitle": "Registro guardado con éxito."
}
},
"menus": {
"currentuser": {
"languageselector": "idioma",
"profile": "Perfil"
},
"profilesidebar": {
"profile": "Mi perfil",
"shops": "Mis tiendas"
}
},
"notes": {
"fields": {
"critical": "Crítico",
"private": "Privado",
"text": "Contenido"
},
"labels": {
"newnoteplaceholder": "Agrega una nota..."
}
},
"profile": {
"errors": {
"state": "Error al leer el estado de la página. Porfavor refresca."
}
},
"titles": {
"app": "Carrocería de ImEX Systems",
"jobs": "Todos los trabajos | $t(titles.app)",
"jobsdetail": "Trabajo {{ro_number}} | $t(titles.app)",
"profile": "Mi perfil | $ t (títulos.app)"
},
"vehicles": {
"fields": {
"plate_no": "Placa"
}
}
}
} }

View File

@@ -1,22 +1,108 @@
{ {
"translation": { "translation": {
"general": { "general": {
"languages": { "labels": {
"english": "Anglais", "in": "dans",
"french": "Francais", "loading": "Chargement...",
"spanish": "Espanol" "na": "N / A",
}, "out": "En dehors",
"title": "Welcome to {{framework}}", "save": "sauvegarder",
"greetings": "Hello2!", "unknown": "Inconnu"
"intro": "To get started, edit <1><0></0></1> and save to reload." },
}, "languages": {
"whiteboard": { "english": "Anglais",
"viewJobImages": "Viewez le Job Images", "french": "Francais",
"printCenter": "Printez Centre", "spanish": "Espanol"
"postInvoices": "Postez le Invoices", }
"notes": "Le Job Notes", },
"partStatus": "Status de Parts", "jobs": {
"receiveParts": "Receive Parts" "actions": {
} "addDocuments": "Ajouter des documents de travail",
} "addNote": "Ajouter une note",
"postInvoices": "Poster des factures",
"printCenter": "Centre d'impression"
},
"errors": {
"noaccess": "Ce travail n'existe pas ou vous n'y avez pas accès.",
"nojobselected": "Aucun travail n'est sélectionné.",
"noowner": "Aucun propriétaire associé.",
"novehicle": "Aucun véhicule associé.",
"saving": "Erreur rencontrée lors de la sauvegarde de l'enregistrement.",
"validation": "Veuillez vous assurer que tous les champs sont correctement entrés.",
"validationtitle": "Erreur de validation"
},
"fields": {
"claim_total": "Total réclamation",
"clm_no": "Prétendre #",
"clm_total": "Total réclamation",
"deductible": "Déductible",
"est_number": "Numéro d'estimation",
"owner": "Propriétaire",
"owner_owing": "Cust. Owes",
"phone1": "Téléphone 1",
"ro_number": "RO #",
"status": "Statut de l'emploi",
"vehicle": "Véhicule"
},
"labels": {
"cards": {
"appraiser": "Expert",
"customer": "Informations client",
"damage": "Zone de dommages",
"dates": "Rendez-vous",
"documents": "Les documents",
"estimator": "Estimateur",
"filehandler": "Gestionnaire de fichiers",
"insurance": "Détails de l'assurance",
"notes": "Remarques",
"parts": "les pièces",
"totals": "Totaux",
"vehicle": "Véhicule"
},
"convert": "Convertir",
"vehicle_info": "Véhicule"
},
"successes": {
"converted": "Travail converti avec succès.",
"save": "Enregistrement enregistré",
"savetitle": "Enregistrement enregistré avec succès."
}
},
"menus": {
"currentuser": {
"languageselector": "La langue",
"profile": "Profil"
},
"profilesidebar": {
"profile": "Mon profil",
"shops": "Mes boutiques"
}
},
"notes": {
"fields": {
"critical": "Critique",
"private": "privé",
"text": "Contenu"
},
"labels": {
"newnoteplaceholder": "Ajouter une note..."
}
},
"profile": {
"errors": {
"state": "Erreur lors de la lecture de l'état de la page. Rafraichissez, s'il vous plait."
}
},
"titles": {
"app": "Carrosserie par ImEX Systems",
"jobs": "Tous les emplois | $t(titles.app)",
"jobsdetail": "Travail {{ro_number}} | $t(titles.app)",
"profile": "Mon profil | $ t (titres.app)"
},
"vehicles": {
"fields": {
"plate_no": "Plaque d'immatriculation"
}
}
}
} }

View File

@@ -0,0 +1,3 @@
- args:
sql: DROP TABLE "public"."counters"
type: run_sql

View File

@@ -0,0 +1,19 @@
- args:
sql: CREATE EXTENSION IF NOT EXISTS pgcrypto;
type: run_sql
- args:
sql: "CREATE TABLE \"public\".\"counters\"(\"id\" uuid NOT NULL DEFAULT gen_random_uuid(),
\"updated_at\" timestamptz NOT NULL DEFAULT now(), \"shopid\" uuid NOT NULL,
\"countertype\" text NOT NULL, \"prefix\" text, \"count\" integer NOT NULL DEFAULT
1, PRIMARY KEY (\"id\") , FOREIGN KEY (\"shopid\") REFERENCES \"public\".\"bodyshops\"(\"id\")
ON UPDATE cascade ON DELETE cascade);\nCREATE OR REPLACE FUNCTION \"public\".\"set_current_timestamp_updated_at\"()\nRETURNS
TRIGGER AS $$\nDECLARE\n _new record;\nBEGIN\n _new := NEW;\n _new.\"updated_at\"
= NOW();\n RETURN _new;\nEND;\n$$ LANGUAGE plpgsql;\nCREATE TRIGGER \"set_public_counters_updated_at\"\nBEFORE
UPDATE ON \"public\".\"counters\"\nFOR EACH ROW\nEXECUTE PROCEDURE \"public\".\"set_current_timestamp_updated_at\"();\nCOMMENT
ON TRIGGER \"set_public_counters_updated_at\" ON \"public\".\"counters\" \nIS
'trigger to set value of column \"updated_at\" to current timestamp on row update';\n"
type: run_sql
- args:
name: counters
schema: public
type: add_existing_table_or_view

View File

@@ -0,0 +1,24 @@
- args:
relationship: counters
table:
name: bodyshops
schema: public
type: drop_relationship
- args:
relationship: bodyshop
table:
name: counters
schema: public
type: drop_relationship
- args:
relationship: user
table:
name: notes
schema: public
type: drop_relationship
- args:
relationship: notes
table:
name: users
schema: public
type: drop_relationship

View File

@@ -0,0 +1,40 @@
- args:
name: counters
table:
name: bodyshops
schema: public
using:
foreign_key_constraint_on:
column: shopid
table:
name: counters
schema: public
type: create_array_relationship
- args:
name: bodyshop
table:
name: counters
schema: public
using:
foreign_key_constraint_on: shopid
type: create_object_relationship
- args:
name: user
table:
name: notes
schema: public
using:
foreign_key_constraint_on: created_by
type: create_object_relationship
- args:
name: notes
table:
name: users
schema: public
using:
foreign_key_constraint_on:
column: created_by
table:
name: notes
schema: public
type: create_array_relationship

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,8 @@
- args:
cascade: true
sql: "CREATE OR REPLACE FUNCTION assign_ro_number()\r\n RETURNS trigger\r\n LANGUAGE
plpgsql\r\nAS $function$\r\n begin\r\n IF NEW.converted = true and
new.ro_number is null THEN\r\n UPDATE counters\r\n\tSET count = count
+ 1 where shopid=new.shopid\r\n\tRETURNING CONCAT(prefix,count) into new.ro_number;\r\n\r\n
\ END IF;\r\n RETURN NEW;\r\n END;\r\n $function$\r\n;\r\n"
type: run_sql

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,5 @@
- args:
cascade: true
sql: "create trigger jobs_assign_RO before\r\nupdate\r\n on\r\n jobs for
each row execute function assign_ro_number();\r\n"
type: run_sql

View File

@@ -0,0 +1,3 @@
- args:
sql: ALTER TABLE "public"."jobs" DROP COLUMN "converted";
type: run_sql

View File

@@ -0,0 +1,4 @@
- args:
sql: ALTER TABLE "public"."jobs" ADD COLUMN "converted" boolean NOT NULL DEFAULT
false;
type: run_sql

View File

@@ -0,0 +1,128 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- shopid
- est_number
- ro_number
- ownerid
- vehicleid
- labor_rate_id
- labor_rate_desc
- rate_lab
- rate_lad
- rate_lae
- rate_lar
- rate_las
- rate_laf
- rate_lam
- rate_lag
- rate_atp
- rate_lau
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_mapa
- rate_mash
- rate_mahw
- rate_ma2s
- rate_ma3s
- rate_ma2t
- rate_mabl
- rate_macs
- rate_matd
- federal_tax_rate
- state_tax_rate
- local_tax_rate
- est_co_nm
- est_addr1
- est_addr2
- est_city
- est_st
- est_zip
- est_ctry
- est_ph1
- est_ea
- est_ct_ln
- est_ct_fn
- scheduled_in
- actual_in
- scheduled_completion
- actual_completion
- scheduled_delivery
- actual_delivery
- regie_number
- invoice_date
- claim_total
- deductible
- inproduction
- statusid
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_owner_email
- pit_vehicle_plate_no
- ins_co_id
- ins_co_nm
- ins_addr1
- ins_addr2
- ins_city
- ins_st
- ins_zip
- ins_ctry
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_fax
- ins_faxx
- ins_ct_ln
- ins_ct_fn
- ins_title
- ins_ct_ph
- ins_ct_phx
- ins_ea
- ins_memo
- policy_no
- ded_amt
- ded_status
- asgn_no
- asgn_date
- asgn_type
- clm_no
- clm_ofc_id
- date_estimated
- date_open
- date_scheduled
- date_invoiced
- date_closed
- date_exported
- clm_total
- owner_owing
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,129 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- shopid
- est_number
- ro_number
- ownerid
- vehicleid
- labor_rate_id
- labor_rate_desc
- rate_lab
- rate_lad
- rate_lae
- rate_lar
- rate_las
- rate_laf
- rate_lam
- rate_lag
- rate_atp
- rate_lau
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_mapa
- rate_mash
- rate_mahw
- rate_ma2s
- rate_ma3s
- rate_ma2t
- rate_mabl
- rate_macs
- rate_matd
- federal_tax_rate
- state_tax_rate
- local_tax_rate
- est_co_nm
- est_addr1
- est_addr2
- est_city
- est_st
- est_zip
- est_ctry
- est_ph1
- est_ea
- est_ct_ln
- est_ct_fn
- scheduled_in
- actual_in
- scheduled_completion
- actual_completion
- scheduled_delivery
- actual_delivery
- regie_number
- invoice_date
- claim_total
- deductible
- inproduction
- statusid
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_owner_email
- pit_vehicle_plate_no
- ins_co_id
- ins_co_nm
- ins_addr1
- ins_addr2
- ins_city
- ins_st
- ins_zip
- ins_ctry
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_fax
- ins_faxx
- ins_ct_ln
- ins_ct_fn
- ins_title
- ins_ct_ph
- ins_ct_phx
- ins_ea
- ins_memo
- policy_no
- ded_amt
- ded_status
- asgn_no
- asgn_date
- asgn_type
- clm_no
- clm_ofc_id
- date_estimated
- date_open
- date_scheduled
- date_invoiced
- date_closed
- date_exported
- clm_total
- owner_owing
- converted
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,126 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- ded_status
- inproduction
- asgn_date
- invoice_date
- claim_total
- clm_total
- ded_amt
- deductible
- federal_tax_rate
- local_tax_rate
- owner_owing
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- state_tax_rate
- asgn_no
- asgn_type
- clm_no
- clm_ofc_id
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- labor_rate_desc
- labor_rate_id
- pit_owner_email
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_vehicle_plate_no
- policy_no
- regie_number
- ro_number
- actual_completion
- actual_delivery
- actual_in
- created_at
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- scheduled_completion
- scheduled_delivery
- scheduled_in
- updated_at
- id
- ownerid
- shopid
- statusid
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,127 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- converted
- ded_status
- inproduction
- asgn_date
- invoice_date
- claim_total
- clm_total
- ded_amt
- deductible
- federal_tax_rate
- local_tax_rate
- owner_owing
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- state_tax_rate
- asgn_no
- asgn_type
- clm_no
- clm_ofc_id
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- labor_rate_desc
- labor_rate_id
- pit_owner_email
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_vehicle_plate_no
- policy_no
- regie_number
- ro_number
- actual_completion
- actual_delivery
- actual_in
- created_at
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- scheduled_completion
- scheduled_delivery
- scheduled_in
- updated_at
- id
- ownerid
- shopid
- statusid
- vehicleid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: jobs
schema: public
type: create_select_permission

View File

@@ -0,0 +1,128 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- ded_status
- inproduction
- asgn_date
- invoice_date
- claim_total
- clm_total
- ded_amt
- deductible
- federal_tax_rate
- local_tax_rate
- owner_owing
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- state_tax_rate
- asgn_no
- asgn_type
- clm_no
- clm_ofc_id
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- labor_rate_desc
- labor_rate_id
- pit_owner_email
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_vehicle_plate_no
- policy_no
- regie_number
- ro_number
- actual_completion
- actual_delivery
- actual_in
- created_at
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- scheduled_completion
- scheduled_delivery
- scheduled_in
- updated_at
- id
- ownerid
- shopid
- statusid
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1,129 @@
- args:
role: user
table:
name: jobs
schema: public
type: drop_update_permission
- args:
permission:
columns:
- converted
- ded_status
- inproduction
- asgn_date
- invoice_date
- claim_total
- clm_total
- ded_amt
- deductible
- federal_tax_rate
- local_tax_rate
- owner_owing
- rate_atp
- rate_la1
- rate_la2
- rate_la3
- rate_la4
- rate_lab
- rate_lad
- rate_lae
- rate_laf
- rate_lag
- rate_lam
- rate_lar
- rate_las
- rate_lau
- rate_ma2s
- rate_ma2t
- rate_ma3s
- rate_mabl
- rate_macs
- rate_mahw
- rate_mapa
- rate_mash
- rate_matd
- state_tax_rate
- asgn_no
- asgn_type
- clm_no
- clm_ofc_id
- est_addr1
- est_addr2
- est_city
- est_co_nm
- est_ct_fn
- est_ct_ln
- est_ctry
- est_ea
- est_number
- est_ph1
- est_st
- est_zip
- ins_addr1
- ins_addr2
- ins_city
- ins_co_id
- ins_co_nm
- ins_ct_fn
- ins_ct_ln
- ins_ct_ph
- ins_ct_phx
- ins_ctry
- ins_ea
- ins_fax
- ins_faxx
- ins_memo
- ins_ph1
- ins_ph1x
- ins_ph2
- ins_ph2x
- ins_st
- ins_title
- ins_zip
- labor_rate_desc
- labor_rate_id
- pit_owner_email
- pit_owner_first_name
- pit_owner_last_name
- pit_owner_phone
- pit_vehicle_plate_no
- policy_no
- regie_number
- ro_number
- actual_completion
- actual_delivery
- actual_in
- created_at
- date_closed
- date_estimated
- date_exported
- date_invoiced
- date_open
- date_scheduled
- scheduled_completion
- scheduled_delivery
- scheduled_in
- updated_at
- id
- ownerid
- shopid
- statusid
- vehicleid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: jobs
schema: public
type: create_update_permission

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,9 @@
- args:
cascade: true
sql: "CREATE OR REPLACE FUNCTION public.assign_ro_number()\r\n RETURNS trigger\r\n
LANGUAGE plpgsql\r\nAS $function$\r\n begin\r\n IF NEW.converted
= true and new.ro_number is null THEN\r\n UPDATE counters\r\n\tSET
count = count + 1 where shopid=new.shopid AND countertype=\"ronum\"\r\n\tRETURNING
CONCAT(prefix,count) into new.ro_number;\r\n\r\n END IF;\r\n RETURN
NEW;\r\n END;\r\n $function$\r\n;\r\n"
type: run_sql

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,9 @@
- args:
cascade: true
sql: "CREATE OR REPLACE FUNCTION public.assign_ro_number()\r\n RETURNS trigger\r\n
LANGUAGE plpgsql\r\nAS $function$\r\n begin\r\n IF NEW.converted
= true and (new.ro_number is null or new.ro_number = '') THEN\r\n UPDATE
counters\r\n\tSET count = count + 1 where shopid=new.shopid AND countertype
= 'ronum'\r\n\tRETURNING count into new.ro_number;\r\n\r\n END IF;\r\n
\ RETURN NEW;\r\n END;\r\n $function$\r\n;\r\n"
type: run_sql

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,9 @@
- args:
cascade: true
sql: "CREATE OR REPLACE FUNCTION public.assign_ro_number()\r\n RETURNS trigger\r\n
LANGUAGE plpgsql\r\nAS $function$\r\n begin\r\n IF NEW.converted
= true and (new.ro_number is null or new.ro_number = '') THEN\r\n UPDATE
counters\r\n\tSET count = count + 1 where shopid=new.shopid AND countertype
= 'ronum'\r\n\tRETURNING concat(prefix,count) into new.ro_number;\r\n\r\n END
IF;\r\n RETURN NEW;\r\n END;\r\n $function$\r\n;\r\n"
type: run_sql