180
.circleci/config.yml
Normal file
180
.circleci/config.yml
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
version: 2.1
|
||||||
|
orbs:
|
||||||
|
#snyk: snyk/snyk@0.0.8
|
||||||
|
#cypress: cypress-io/cypress@1.23.0
|
||||||
|
aws-s3: circleci/aws-s3@2.0.0
|
||||||
|
eb: circleci/aws-elastic-beanstalk@1.0.2
|
||||||
|
jira: circleci/jira@1.3.1
|
||||||
|
jobs:
|
||||||
|
api-deploy:
|
||||||
|
docker:
|
||||||
|
- image: "cimg/base:stable"
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- eb/setup
|
||||||
|
- run:
|
||||||
|
command: |
|
||||||
|
eb init imex-online-production-api -r ca-central-1 -p "Node.js 16 running on 64bit Amazon Linux 2"
|
||||||
|
eb status --verbose
|
||||||
|
eb deploy
|
||||||
|
eb status
|
||||||
|
- jira/notify
|
||||||
|
|
||||||
|
hasura-migrate:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:16.15.0
|
||||||
|
parameters:
|
||||||
|
secret:
|
||||||
|
type: string
|
||||||
|
default: $HASURA_PROD_SECRET
|
||||||
|
working_directory: ~/repo/hasura
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
- run:
|
||||||
|
name: Execute migration
|
||||||
|
command: |
|
||||||
|
npm install hasura-cli -g
|
||||||
|
hasura migrate apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
|
||||||
|
hasura metadata apply --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
|
||||||
|
hasura metadata reload --endpoint https://db.imex.online/ --admin-secret << parameters.secret >>
|
||||||
|
|
||||||
|
app-build:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:16.15.0
|
||||||
|
|
||||||
|
working_directory: ~/repo/client
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
|
||||||
|
- restore_cache:
|
||||||
|
name: Restore Yarn Package Cache
|
||||||
|
keys:
|
||||||
|
- yarn-packages-{{ checksum "yarn.lock" }}
|
||||||
|
- run:
|
||||||
|
name: Install Dependencies
|
||||||
|
command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
|
||||||
|
- save_cache:
|
||||||
|
name: Save Yarn Package Cache
|
||||||
|
key: yarn-packages-{{ checksum "yarn.lock" }}
|
||||||
|
paths:
|
||||||
|
- ~/.cache/yarn
|
||||||
|
|
||||||
|
- run: yarn run build
|
||||||
|
|
||||||
|
- aws-s3/sync:
|
||||||
|
from: build
|
||||||
|
to: "s3://imex-online-production/"
|
||||||
|
- jira/notify
|
||||||
|
|
||||||
|
test-hasura-migrate:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:16.15.0
|
||||||
|
parameters:
|
||||||
|
secret:
|
||||||
|
type: string
|
||||||
|
default: $HASURA_TEST_SECRET
|
||||||
|
working_directory: ~/repo/hasura
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
- run:
|
||||||
|
name: Execute migration
|
||||||
|
command: |
|
||||||
|
npm install hasura-cli -g
|
||||||
|
echo ${HASURA_TEST_SECRET}
|
||||||
|
hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
|
||||||
|
hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
|
||||||
|
hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
|
||||||
|
|
||||||
|
test-app-build:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:16.15.0
|
||||||
|
|
||||||
|
working_directory: ~/repo/client
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
|
||||||
|
- restore_cache:
|
||||||
|
name: Restore Yarn Package Cache
|
||||||
|
keys:
|
||||||
|
- yarn-packages-{{ checksum "yarn.lock" }}
|
||||||
|
- run:
|
||||||
|
name: Install Dependencies
|
||||||
|
command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
|
||||||
|
- save_cache:
|
||||||
|
name: Save Yarn Package Cache
|
||||||
|
key: yarn-packages-{{ checksum "yarn.lock" }}
|
||||||
|
paths:
|
||||||
|
- ~/.cache/yarn
|
||||||
|
|
||||||
|
- run: yarn run build:test
|
||||||
|
|
||||||
|
- aws-s3/sync:
|
||||||
|
from: build
|
||||||
|
to: "s3://imex-online-test/"
|
||||||
|
- jira/notify
|
||||||
|
|
||||||
|
admin-app-build:
|
||||||
|
docker:
|
||||||
|
- image: cimg/node:16.15.0
|
||||||
|
|
||||||
|
working_directory: ~/repo/admin
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- checkout:
|
||||||
|
path: ~/repo
|
||||||
|
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- v1-dependencies-{{ checksum "package.json" }}
|
||||||
|
# fallback to using the latest cache if no exact match is found
|
||||||
|
- v1-dependencies-
|
||||||
|
- run: npm i
|
||||||
|
|
||||||
|
- save_cache:
|
||||||
|
paths:
|
||||||
|
- node_modules
|
||||||
|
- ~/.npm
|
||||||
|
- ~/.cache
|
||||||
|
key: v1-dependencies-{{ checksum "package.json" }}
|
||||||
|
|
||||||
|
- run: npm run build
|
||||||
|
|
||||||
|
- aws-s3/sync:
|
||||||
|
from: build
|
||||||
|
to: "s3://adm.imex.online/"
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
deploy_and_build:
|
||||||
|
jobs:
|
||||||
|
- api-deploy:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
- app-build:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
- hasura-migrate:
|
||||||
|
secret: ${HASURA_PROD_SECRET}
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
- test-app-build:
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: test
|
||||||
|
- test-hasura-migrate:
|
||||||
|
secret: ${HASURA_TEST_SECRET}
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only: test
|
||||||
|
#- admin-app-build:
|
||||||
|
#filters:
|
||||||
|
#branches:
|
||||||
|
#only: master
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -115,4 +115,6 @@ firebase/.env
|
|||||||
logs/oAuthClient-log.log
|
logs/oAuthClient-log.log
|
||||||
|
|
||||||
|
|
||||||
.node-persist/**
|
.node-persist/**
|
||||||
|
|
||||||
|
/*.env.*
|
||||||
@@ -40455,6 +40455,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>cycle_time_analysis</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>estimates_written_converted</name>
|
<name>estimates_written_converted</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
13
client/.env.development
Normal file
13
client/.env.development
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
REACT_APP_GRAPHQL_ENDPOINT=https://db.dev.bodyshop.app/v1/graphql
|
||||||
|
REACT_APP_GRAPHQL_ENDPOINT_WS=wss://db.dev.bodyshop.app/v1/graphql
|
||||||
|
REACT_APP_GA_CODE=231099835
|
||||||
|
REACT_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"}
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/io-test
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/io-test
|
||||||
|
REACT_APP_CLOUDINARY_API_KEY=957865933348715
|
||||||
|
REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
|
||||||
|
REACT_APP_FIREBASE_PUBLIC_VAPID_KEY='BG3tzU7L2BXlGZ_3VLK4PNaRceoEXEnmHfxcVbRMF5o5g05ejslhVPki9kBM9cBBT-08Ad9kN3HSpS6JmrWD6h4'
|
||||||
|
REACT_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
|
||||||
|
REACT_APP_AXIOS_BASE_API_URL=https://api.imex.online/
|
||||||
|
REACT_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online
|
||||||
|
REACT_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
|
||||||
13
client/.env.production
Normal file
13
client/.env.production
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
REACT_APP_GRAPHQL_ENDPOINT=https://db.imex.online/v1/graphql
|
||||||
|
REACT_APP_GRAPHQL_ENDPOINT_WS=wss://db.imex.online/v1/graphql
|
||||||
|
REACT_APP_GA_CODE=231103507
|
||||||
|
REACT_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDSezy-jGJreo7ulgpLdlpOwAOrgcaEkhU","authDomain":"imex-prod.firebaseapp.com","databaseURL":"https://imex-prod.firebaseio.com","projectId":"imex-prod","storageBucket":"imex-prod.appspot.com","messagingSenderId":"253497221485","appId":"1:253497221485:web:3c81c483b94db84b227a64","measurementId":"G-NTWBKG2L0M"}
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/bodyshop
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/bodyshop
|
||||||
|
REACT_APP_CLOUDINARY_API_KEY=473322739956866
|
||||||
|
REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
|
||||||
|
REACT_APP_FIREBASE_PUBLIC_VAPID_KEY='BMgZT1NZztW2DsJl8Mg2L04hgY9FzAg6b8fbzgNAfww2VDzH3VE63Ot9EaP_U7KWS2JT-7HPHaw0T_Tw_5vkZc8'
|
||||||
|
REACT_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
|
||||||
|
REACT_APP_AXIOS_BASE_API_URL=https://api.imex.online/
|
||||||
|
REACT_APP_REPORTS_SERVER_URL=https://reports.imex.online
|
||||||
|
REACT_APP_SPLIT_API=et9pjkik6bn67he5evpmpr1agoo7gactphgk
|
||||||
14
client/.env.test
Normal file
14
client/.env.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
REACT_APP_GRAPHQL_ENDPOINT=https://db.test.bodyshop.app/v1/graphql
|
||||||
|
REACT_APP_GRAPHQL_ENDPOINT_WS=wss://db.test.bodyshop.app/v1/graphql
|
||||||
|
REACT_APP_GA_CODE=231099835
|
||||||
|
REACT_APP_FIREBASE_CONFIG={ "apiKey":"AIzaSyBw7_GTy7GtQyfkIRPVrWHEGKfcqeyXw0c", "authDomain":"imex-test.firebaseapp.com", "projectId":"imex-test", "storageBucket":"imex-test.appspot.com", "messagingSenderId":"991923618608", "appId":"1:991923618608:web:633437569cdad78299bef5", "measurementId":"G-TW0XLZEH18"}
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/bodyshop
|
||||||
|
REACT_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/bodyshop
|
||||||
|
REACT_APP_CLOUDINARY_API_KEY=473322739956866
|
||||||
|
REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250
|
||||||
|
REACT_APP_FIREBASE_PUBLIC_VAPID_KEY='BN2GcDPjipR5MTEosO5dT4CfQ3cmrdBIsI4juoOQrRijn_5aRiHlwj1mlq0W145mOusx6xynEKl_tvYJhpCc9lo'
|
||||||
|
REACT_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g
|
||||||
|
REACT_APP_AXIOS_BASE_API_URL=https://api.test.imex.online/
|
||||||
|
REACT_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online
|
||||||
|
REACT_APP_IS_TEST=true
|
||||||
|
REACT_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc
|
||||||
@@ -39,7 +39,13 @@ export function ContractsFindModalContainer({
|
|||||||
if (!claim || !shortclaim) return;
|
if (!claim || !shortclaim) return;
|
||||||
const trimmedShortClaim = shortclaim.trim();
|
const trimmedShortClaim = shortclaim.trim();
|
||||||
// const trimmedClaim = claim.trim();
|
// const trimmedClaim = claim.trim();
|
||||||
claimNumbers.push({ claim: trimmedShortClaim, amount });
|
if (amount.slice(-1) === "-") {
|
||||||
|
}
|
||||||
|
|
||||||
|
claimNumbers.push({
|
||||||
|
claim: trimmedShortClaim,
|
||||||
|
amount: amount.slice(-1) === "-" ? parseFloat(amount) * -1 : amount,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
await GenerateDocument(
|
await GenerateDocument(
|
||||||
|
|||||||
@@ -140,7 +140,10 @@ export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Button disabled={!socket.allocationsSummary} htmlType="submit">
|
<Button
|
||||||
|
disabled={!allocationsSummary || allocationsSummary.length === 0}
|
||||||
|
htmlType="submit"
|
||||||
|
>
|
||||||
{t("jobs.actions.dms.post")}
|
{t("jobs.actions.dms.post")}
|
||||||
</Button>
|
</Button>
|
||||||
</Form>
|
</Form>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import Icon, {
|
|||||||
FileAddFilled,
|
FileAddFilled,
|
||||||
FileAddOutlined,
|
FileAddOutlined,
|
||||||
FileFilled,
|
FileFilled,
|
||||||
GlobalOutlined,
|
//GlobalOutlined,
|
||||||
HomeFilled,
|
HomeFilled,
|
||||||
ImportOutlined,
|
ImportOutlined,
|
||||||
LineChartOutlined,
|
LineChartOutlined,
|
||||||
@@ -374,25 +374,27 @@ function Header({
|
|||||||
<Menu.Item key="profile">
|
<Menu.Item key="profile">
|
||||||
<Link to="/manage/profile">{t("menus.currentuser.profile")}</Link>
|
<Link to="/manage/profile">{t("menus.currentuser.profile")}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.SubMenu
|
{
|
||||||
key="langselecter"
|
// <Menu.SubMenu
|
||||||
title={
|
// key="langselecter"
|
||||||
<span>
|
// title={
|
||||||
<GlobalOutlined />
|
// <span>
|
||||||
<span>{t("menus.currentuser.languageselector")}</span>
|
// <GlobalOutlined />
|
||||||
</span>
|
// <span>{t("menus.currentuser.languageselector")}</span>
|
||||||
}
|
// </span>
|
||||||
>
|
// }
|
||||||
<Menu.Item actiontype="lang-select" key="en-US">
|
// >
|
||||||
{t("general.languages.english")}
|
// <Menu.Item actiontype="lang-select" key="en-US">
|
||||||
</Menu.Item>
|
// {t("general.languages.english")}
|
||||||
<Menu.Item actiontype="lang-select" key="fr-CA">
|
// </Menu.Item>
|
||||||
{t("general.languages.french")}
|
// <Menu.Item actiontype="lang-select" key="fr-CA">
|
||||||
</Menu.Item>
|
// {t("general.languages.french")}
|
||||||
<Menu.Item actiontype="lang-select" key="es-MX">
|
// </Menu.Item>
|
||||||
{t("general.languages.spanish")}
|
// <Menu.Item actiontype="lang-select" key="es-MX">
|
||||||
</Menu.Item>
|
// {t("general.languages.spanish")}
|
||||||
</Menu.SubMenu>
|
// </Menu.Item>
|
||||||
|
// </Menu.SubMenu>
|
||||||
|
}
|
||||||
</Menu.SubMenu>
|
</Menu.SubMenu>
|
||||||
<Menu.SubMenu key="recent" title={<ClockCircleFilled />}>
|
<Menu.SubMenu key="recent" title={<ClockCircleFilled />}>
|
||||||
{recentItems.map((i, idx) => (
|
{recentItems.map((i, idx) => (
|
||||||
|
|||||||
@@ -855,7 +855,7 @@ export const QUERY_JOB_CARD_DETAILS = gql`
|
|||||||
count
|
count
|
||||||
status
|
status
|
||||||
}
|
}
|
||||||
joblines {
|
joblines(where: { removed: { _eq: false } }) {
|
||||||
id
|
id
|
||||||
mod_lbr_ty
|
mod_lbr_ty
|
||||||
mod_lb_hrs
|
mod_lb_hrs
|
||||||
|
|||||||
@@ -2099,7 +2099,7 @@
|
|||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"balance": "Balance",
|
"balance": "Balance",
|
||||||
"ca_bc_etf_table": "ICBC ETF Table Converter",
|
"ca_bc_etf_table": "ICBC EFT Table Converter",
|
||||||
"customer": "Customer",
|
"customer": "Customer",
|
||||||
"edit": "Edit Payment",
|
"edit": "Edit Payment",
|
||||||
"electronicpayment": "Use Electronic Payment Processing?",
|
"electronicpayment": "Use Electronic Payment Processing?",
|
||||||
@@ -2275,7 +2275,7 @@
|
|||||||
"title": "Print Center"
|
"title": "Print Center"
|
||||||
},
|
},
|
||||||
"payments": {
|
"payments": {
|
||||||
"ca_bc_etf_table": "ICBC ETF Table",
|
"ca_bc_etf_table": "ICBC EFT Table",
|
||||||
"exported_payroll": "Payroll Table"
|
"exported_payroll": "Payroll Table"
|
||||||
},
|
},
|
||||||
"special": {
|
"special": {
|
||||||
@@ -2403,6 +2403,7 @@
|
|||||||
"credits_not_received_date": "Credits not Received by Date",
|
"credits_not_received_date": "Credits not Received by Date",
|
||||||
"credits_not_received_date_vendorid": "Credits not Received by Vendor",
|
"credits_not_received_date_vendorid": "Credits not Received by Vendor",
|
||||||
"csi": "CSI Responses",
|
"csi": "CSI Responses",
|
||||||
|
"cycle_time_analysis": "Cycle Time Analysis",
|
||||||
"estimates_written_converted": "Estimates Written/Converted",
|
"estimates_written_converted": "Estimates Written/Converted",
|
||||||
"estimator_detail": "Jobs by Estimator (Detail)",
|
"estimator_detail": "Jobs by Estimator (Detail)",
|
||||||
"estimator_summary": "Jobs by Estimator (Summary)",
|
"estimator_summary": "Jobs by Estimator (Summary)",
|
||||||
|
|||||||
@@ -2403,6 +2403,7 @@
|
|||||||
"credits_not_received_date": "",
|
"credits_not_received_date": "",
|
||||||
"credits_not_received_date_vendorid": "",
|
"credits_not_received_date_vendorid": "",
|
||||||
"csi": "",
|
"csi": "",
|
||||||
|
"cycle_time_analysis": "",
|
||||||
"estimates_written_converted": "",
|
"estimates_written_converted": "",
|
||||||
"estimator_detail": "",
|
"estimator_detail": "",
|
||||||
"estimator_summary": "",
|
"estimator_summary": "",
|
||||||
|
|||||||
@@ -2403,6 +2403,7 @@
|
|||||||
"credits_not_received_date": "",
|
"credits_not_received_date": "",
|
||||||
"credits_not_received_date_vendorid": "",
|
"credits_not_received_date_vendorid": "",
|
||||||
"csi": "",
|
"csi": "",
|
||||||
|
"cycle_time_analysis": "",
|
||||||
"estimates_written_converted": "",
|
"estimates_written_converted": "",
|
||||||
"estimator_detail": "",
|
"estimator_detail": "",
|
||||||
"estimator_summary": "",
|
"estimator_summary": "",
|
||||||
|
|||||||
@@ -22,5 +22,6 @@ const range = {
|
|||||||
moment().startOf("quarter"),
|
moment().startOf("quarter"),
|
||||||
moment().startOf("quarter").add(1, "quarter").subtract(1, "day"),
|
moment().startOf("quarter").add(1, "quarter").subtract(1, "day"),
|
||||||
],
|
],
|
||||||
|
"Last 90 Days": [moment().add(-90, "days"), moment()],
|
||||||
};
|
};
|
||||||
export default range;
|
export default range;
|
||||||
|
|||||||
@@ -1682,6 +1682,18 @@ export const TemplateList = (type, context) => {
|
|||||||
},
|
},
|
||||||
group: "sales",
|
group: "sales",
|
||||||
},
|
},
|
||||||
|
cycle_time_analysis: {
|
||||||
|
title: i18n.t("reportcenter.templates.cycle_time_analysis"),
|
||||||
|
subject: i18n.t("reportcenter.templates.cycle_time_analysis"),
|
||||||
|
key: "cycle_time_analysis",
|
||||||
|
//idtype: "vendor",
|
||||||
|
disabled: false,
|
||||||
|
rangeFilter: {
|
||||||
|
object: i18n.t("reportcenter.labels.objects.jobs"),
|
||||||
|
field: i18n.t("jobs.fields.actual_completion"),
|
||||||
|
},
|
||||||
|
group: "jobs",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
: {}),
|
: {}),
|
||||||
...(!type || type === "courtesycarcontract"
|
...(!type || type === "courtesycarcontract"
|
||||||
|
|||||||
@@ -3769,6 +3769,27 @@
|
|||||||
- active:
|
- active:
|
||||||
_eq: true
|
_eq: true
|
||||||
event_triggers:
|
event_triggers:
|
||||||
|
- name: job_status_transition
|
||||||
|
definition:
|
||||||
|
enable_manual: false
|
||||||
|
insert:
|
||||||
|
columns: '*'
|
||||||
|
update:
|
||||||
|
columns:
|
||||||
|
- status
|
||||||
|
retry_conf:
|
||||||
|
interval_sec: 10
|
||||||
|
num_retries: 0
|
||||||
|
timeout_sec: 60
|
||||||
|
webhook_from_env: HASURA_API_URL
|
||||||
|
headers:
|
||||||
|
- name: event-secret
|
||||||
|
value_from_env: EVENT_SECRET
|
||||||
|
request_transform:
|
||||||
|
query_params: {}
|
||||||
|
template_engine: Kriti
|
||||||
|
url: '{{$base_url}}/job/statustransition'
|
||||||
|
version: 2
|
||||||
- name: jobs_arms
|
- name: jobs_arms
|
||||||
definition:
|
definition:
|
||||||
enable_manual: false
|
enable_manual: false
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ var job = require("./server/job/job");
|
|||||||
app.post("/job/totals", fb.validateFirebaseIdToken, job.totals);
|
app.post("/job/totals", fb.validateFirebaseIdToken, job.totals);
|
||||||
app.post(
|
app.post(
|
||||||
"/job/statustransition",
|
"/job/statustransition",
|
||||||
fb.validateFirebaseIdToken,
|
// fb.validateFirebaseIdToken,
|
||||||
job.statustransition
|
job.statustransition
|
||||||
);
|
);
|
||||||
app.post("/job/totalsssu", fb.validateFirebaseIdToken, job.totalsSsu);
|
app.post("/job/totalsssu", fb.validateFirebaseIdToken, job.totalsSsu);
|
||||||
|
|||||||
@@ -7,22 +7,29 @@ const logger = require("../utils/logger");
|
|||||||
// Dinero.defaultCurrency = "USD";
|
// Dinero.defaultCurrency = "USD";
|
||||||
// Dinero.globalLocale = "en-CA";
|
// Dinero.globalLocale = "en-CA";
|
||||||
Dinero.globalRoundingMode = "HALF_EVEN";
|
Dinero.globalRoundingMode = "HALF_EVEN";
|
||||||
|
const path = require("path");
|
||||||
|
const client = require("../graphql-client/graphql-client").client;
|
||||||
|
require("dotenv").config({
|
||||||
|
path: path.resolve(
|
||||||
|
process.cwd(),
|
||||||
|
`.env.${process.env.NODE_ENV || "development"}`
|
||||||
|
),
|
||||||
|
});
|
||||||
async function StatusTransition(req, res) {
|
async function StatusTransition(req, res) {
|
||||||
const { jobid, value, bodyshopid } = req.body;
|
if (req.headers["event-secret"] !== process.env.EVENT_SECRET) {
|
||||||
|
res.status(403).send("Unauthorized");
|
||||||
const BearerToken = req.headers.authorization;
|
return;
|
||||||
logger.log("job-costing-start", "DEBUG", req.user.email, jobid, null);
|
}
|
||||||
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
|
|
||||||
headers: {
|
|
||||||
Authorization: BearerToken,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
|
const {
|
||||||
|
id: jobid,
|
||||||
|
status: value,
|
||||||
|
shopid: bodyshopid,
|
||||||
|
} = req.body.event.data.new;
|
||||||
try {
|
try {
|
||||||
const { update_transitions } = await client
|
const { update_transitions } = await client.request(
|
||||||
.setHeaders({ Authorization: BearerToken })
|
queries.UPDATE_OLD_TRANSITION,
|
||||||
.request(queries.UPDATE_OLD_TRANSITION, {
|
{
|
||||||
jobid: jobid,
|
jobid: jobid,
|
||||||
existingTransition: {
|
existingTransition: {
|
||||||
end: new Date(),
|
end: new Date(),
|
||||||
@@ -30,7 +37,8 @@ async function StatusTransition(req, res) {
|
|||||||
|
|
||||||
//duration
|
//duration
|
||||||
},
|
},
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
let duration =
|
let duration =
|
||||||
update_transitions.affected_rows === 0
|
update_transitions.affected_rows === 0
|
||||||
@@ -38,29 +46,27 @@ async function StatusTransition(req, res) {
|
|||||||
: new Date(update_transitions.returning[0].end) -
|
: new Date(update_transitions.returning[0].end) -
|
||||||
new Date(update_transitions.returning[0].start);
|
new Date(update_transitions.returning[0].start);
|
||||||
|
|
||||||
const resp2 = await client
|
const resp2 = await client.request(queries.INSERT_NEW_TRANSITION, {
|
||||||
.setHeaders({ Authorization: BearerToken })
|
oldTransitionId:
|
||||||
.request(queries.INSERT_NEW_TRANSITION, {
|
update_transitions.affected_rows === 0
|
||||||
oldTransitionId:
|
? null
|
||||||
|
: update_transitions.returning[0].id,
|
||||||
|
duration,
|
||||||
|
newTransition: {
|
||||||
|
bodyshopid: bodyshopid,
|
||||||
|
jobid: jobid,
|
||||||
|
start:
|
||||||
|
update_transitions.affected_rows === 0
|
||||||
|
? new Date()
|
||||||
|
: update_transitions.returning[0].end,
|
||||||
|
prev_value:
|
||||||
update_transitions.affected_rows === 0
|
update_transitions.affected_rows === 0
|
||||||
? null
|
? null
|
||||||
: update_transitions.returning[0].id,
|
: update_transitions.returning[0].value,
|
||||||
duration,
|
value: value,
|
||||||
newTransition: {
|
type: "status",
|
||||||
bodyshopid: bodyshopid,
|
},
|
||||||
jobid: jobid,
|
});
|
||||||
start:
|
|
||||||
update_transitions.affected_rows === 0
|
|
||||||
? new Date()
|
|
||||||
: update_transitions.returning[0].end,
|
|
||||||
prev_value:
|
|
||||||
update_transitions.affected_rows === 0
|
|
||||||
? null
|
|
||||||
: update_transitions.returning[0].value,
|
|
||||||
value: value,
|
|
||||||
type: "status",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
//Check to see if there is an existing status transition record.
|
//Check to see if there is an existing status transition record.
|
||||||
//Query using Job ID, start is not null, end is null.
|
//Query using Job ID, start is not null, end is null.
|
||||||
|
|||||||
Reference in New Issue
Block a user