From 8141674da8435c0762dc831740a2bcd72d88c487 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Sat, 4 Sep 2021 10:04:07 +0200 Subject: [PATCH] feat: organization setup. --- client/src/common/registerWizard.js | 4 +- .../Organization/withOrganization.js | 15 +- .../containers/Setup/SetupInitializingForm.js | 130 ++++++++++++------ .../Setup/SetupOrganization.schema.js | 2 +- .../containers/Setup/SetupOrganizationForm.js | 6 +- .../containers/Setup/SetupOrganizationPage.js | 7 +- .../src/containers/Setup/SetupRightSection.js | 2 + .../containers/Setup/SetupWizardContent.js | 2 +- client/src/hooks/query/index.js | 1 + client/src/hooks/query/jobs.js | 16 +++ client/src/hooks/query/organization.js | 35 +---- .../organizations/organizations.actions.js | 84 ++++------- .../organizations/organizations.reducers.js | 39 ------ .../organizations/organizations.selectors.js | 21 +-- .../organizations/organizations.types.js | 7 - .../store/organizations/withSetupWizard.js | 15 +- server/src/api/controllers/Organization.ts | 2 +- .../core/20200810121809_seed_settings.js | 52 +++---- 18 files changed, 188 insertions(+), 252 deletions(-) create mode 100644 client/src/hooks/query/jobs.js diff --git a/client/src/common/registerWizard.js b/client/src/common/registerWizard.js index 9b48223f4..595f9a00a 100644 --- a/client/src/common/registerWizard.js +++ b/client/src/common/registerWizard.js @@ -5,10 +5,10 @@ export const getSetupWizardSteps = () => [ label: intl.get('setup.plan.plans'), }, { - label: intl.get('setup.plan.initializing'), + label: intl.get('setup.plan.getting_started'), }, { - label: intl.get('setup.plan.getting_started'), + label: intl.get('setup.plan.initializing'), }, { label: intl.get('setup.plan.congrats'), diff --git a/client/src/containers/Organization/withOrganization.js b/client/src/containers/Organization/withOrganization.js index 8c4b94769..b5752c823 100644 --- a/client/src/containers/Organization/withOrganization.js +++ b/client/src/containers/Organization/withOrganization.js @@ -2,37 +2,30 @@ import { connect } from 'react-redux'; import { getOrganizationByIdFactory, isOrganizationReadyFactory, - isOrganizationSeededFactory, isOrganizationBuiltFactory, - isOrganizationSeedingFactory, - isOrganizationInitializingFactory, isOrganizationSubscribedFactory, isOrganizationCongratsFactory, + isOrganizationBuildRunningFactory } from 'store/organizations/organizations.selectors'; export default (mapState) => { const getOrganizationById = getOrganizationByIdFactory(); const isOrganizationReady = isOrganizationReadyFactory(); - - const isOrganizationSeeded = isOrganizationSeededFactory(); const isOrganizationBuilt = isOrganizationBuiltFactory(); - const isOrganizationInitializing = isOrganizationInitializingFactory(); - const isOrganizationSeeding = isOrganizationSeedingFactory(); - const isOrganizationSubscribed = isOrganizationSubscribedFactory(); const isOrganizationCongrats = isOrganizationCongratsFactory(); + const isOrganizationBuildRunning = isOrganizationBuildRunningFactory(); const mapStateToProps = (state, props) => { const mapped = { organization: getOrganizationById(state, props), isOrganizationReady: isOrganizationReady(state, props), - isOrganizationSeeded: isOrganizationSeeded(state, props), isOrganizationInitialized: isOrganizationBuilt(state, props), - isOrganizationSeeding: isOrganizationInitializing(state, props), - isOrganizationInitializing: isOrganizationSeeding(state, props), + isOrganizationSubscribed: isOrganizationSubscribed(state, props), isOrganizationSetupCompleted: isOrganizationCongrats(state, props), + isOrganizationBuildRunning: isOrganizationBuildRunning(state, props) }; return (mapState) ? mapState(mapped, state, props) : mapped; }; diff --git a/client/src/containers/Setup/SetupInitializingForm.js b/client/src/containers/Setup/SetupInitializingForm.js index 606cd9161..3545caa15 100644 --- a/client/src/containers/Setup/SetupInitializingForm.js +++ b/client/src/containers/Setup/SetupInitializingForm.js @@ -1,62 +1,108 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import { ProgressBar, Intent } from '@blueprintjs/core'; -import { useBuildTenant } from 'hooks/query'; +import * as R from 'ramda'; + +import { useJob, useCurrentOrganization } from 'hooks/query'; import { FormattedMessage as T } from 'components'; +import withOrganizationActions from 'containers/Organization/withOrganizationActions'; +import withCurrentOrganization from 'containers/Organization/withCurrentOrganization'; +import withOrganization from '../Organization/withOrganization'; + import 'style/pages/Setup/Initializing.scss'; /** * Setup initializing step form. */ -export default function SetupInitializingForm() { +function SetupInitializingForm({ + setOrganizationSetupCompleted, + organization, +}) { + const { refetch, isSuccess } = useCurrentOrganization({ enabled: false }); + + const [isJobDone, setIsJobDone] = React.useState(false); + const { - mutateAsync: buildTenantMutate, - isLoading, - isError, - } = useBuildTenant(); + data: { running, queued, failed, completed }, + } = useJob(organization?.build_job_id, { + refetchInterval: 2000, + enabled: !!organization?.build_job_id, + }); React.useEffect(() => { - buildTenantMutate(); - }, [buildTenantMutate]); + if (completed) { + refetch(); + setIsJobDone(true); + } + }, [refetch, completed, setOrganizationSetupCompleted]); + + React.useEffect(() => { + if (isSuccess && isJobDone) { + setOrganizationSetupCompleted(true); + setIsJobDone(false); + } + }, [setOrganizationSetupCompleted, isJobDone, isSuccess]); return (
- {isLoading && } +
- {isLoading ? ( - <> -

- -

-

- -

- - ) : isError ? ( - <> -

- -

-

- -

- - ) : ( - <> -

- -

-

- -

- - )} + {failed ? ( + + ) : running || queued ? ( + + ) : completed ? ( + + ) : null}
); } + +export default R.compose( + withOrganizationActions, + withCurrentOrganization(({ organizationTenantId }) => ({ + organizationId: organizationTenantId, + })), + withOrganization(({ organization }) => ({ organization })), +)(SetupInitializingForm); + +function SetupInitializingFailed() { + return ( +
+

+ +

+

+ +

+
+ ); +} + +function SetupInitializingRunning() { + return ( +
+

+ +

+

+ +

+
+ ); +} + +function SetupInitializingCompleted() { + return ( +
+

+ +

+

+ +

+
+ ); +} diff --git a/client/src/containers/Setup/SetupOrganization.schema.js b/client/src/containers/Setup/SetupOrganization.schema.js index 02f000d90..b7d4c93ad 100644 --- a/client/src/containers/Setup/SetupOrganization.schema.js +++ b/client/src/containers/Setup/SetupOrganization.schema.js @@ -11,5 +11,5 @@ export const getSetupOrganizationValidation = () => baseCurrency: Yup.string().required().label(intl.get('base_currency_')), language: Yup.string().required().label(intl.get('language')), fiscalYear: Yup.string().required().label(intl.get('fiscal_year_')), - timeZone: Yup.string().required().label(intl.get('time_zone_')), + timezone: Yup.string().required().label(intl.get('time_zone_')), }); diff --git a/client/src/containers/Setup/SetupOrganizationForm.js b/client/src/containers/Setup/SetupOrganizationForm.js index 8d271bed6..423602d45 100644 --- a/client/src/containers/Setup/SetupOrganizationForm.js +++ b/client/src/containers/Setup/SetupOrganizationForm.js @@ -195,7 +195,7 @@ export default function SetupOrganizationForm({ isSubmitting, values }) { {/* ---------- Time zone ---------- */} - + {({ form: { setFieldValue }, field: { value }, @@ -209,12 +209,12 @@ export default function SetupOrganizationForm({ isSubmitting, values }) { Classes.FILL, )} intent={inputIntent({ error, touched })} - helperText={} + helperText={} > { - setFieldValue('timeZone', item); + setFieldValue('timezone', item); }} valueDisplayFormat="composite" showLocalTimezone={true} diff --git a/client/src/containers/Setup/SetupOrganizationPage.js b/client/src/containers/Setup/SetupOrganizationPage.js index 72d08362b..a21aec2f6 100644 --- a/client/src/containers/Setup/SetupOrganizationPage.js +++ b/client/src/containers/Setup/SetupOrganizationPage.js @@ -3,7 +3,6 @@ import { Formik } from 'formik'; import moment from 'moment'; import { FormattedMessage as T } from 'components'; - import 'style/pages/Setup/Organization.scss'; import SetupOrganizationForm from './SetupOrganizationForm'; @@ -15,7 +14,6 @@ import withOrganizationActions from 'containers/Organization/withOrganizationAct import { compose, transfromToSnakeCase } from 'utils'; import { getSetupOrganizationValidation } from './SetupOrganization.schema'; - // Initial values. const defaultValues = { organization_name: '', @@ -23,7 +21,7 @@ const defaultValues = { baseCurrency: '', language: 'en', fiscalYear: '', - timeZone: '', + timezone: '', }; /** @@ -43,9 +41,6 @@ function SetupOrganizationPage({ wizard, setOrganizationSetupCompleted }) { // Handle the form submit. const handleSubmit = (values, { setSubmitting, setErrors }) => { organizationSetupMutate({ ...transfromToSnakeCase(values) }) - .then(() => { - return setOrganizationSetupCompleted(true); - }) .then((response) => { setSubmitting(false); wizard.next(); diff --git a/client/src/containers/Setup/SetupRightSection.js b/client/src/containers/Setup/SetupRightSection.js index 96640f6db..ec873205c 100644 --- a/client/src/containers/Setup/SetupRightSection.js +++ b/client/src/containers/Setup/SetupRightSection.js @@ -47,11 +47,13 @@ export default compose( isOrganizationInitialized, isOrganizationSeeded, isOrganizationSetupCompleted, + isOrganizationBuildRunning, }) => ({ organization, isOrganizationInitialized, isOrganizationSeeded, isOrganizationSetupCompleted, + isOrganizationBuildRunning, }), ), withSubscriptions( diff --git a/client/src/containers/Setup/SetupWizardContent.js b/client/src/containers/Setup/SetupWizardContent.js index fbdb8368c..3c44cec69 100644 --- a/client/src/containers/Setup/SetupWizardContent.js +++ b/client/src/containers/Setup/SetupWizardContent.js @@ -19,8 +19,8 @@ export default function SetupWizardContent({ setupStepIndex, setupStepId }) {
- +
diff --git a/client/src/hooks/query/index.js b/client/src/hooks/query/index.js index ea66b8661..b959a5b93 100644 --- a/client/src/hooks/query/index.js +++ b/client/src/hooks/query/index.js @@ -26,3 +26,4 @@ export * from './organization'; export * from './landedCost'; export * from './UniversalSearch/UniversalSearch'; export * from './GenericResource'; +export * from './jobs'; diff --git a/client/src/hooks/query/jobs.js b/client/src/hooks/query/jobs.js new file mode 100644 index 000000000..e54178ae2 --- /dev/null +++ b/client/src/hooks/query/jobs.js @@ -0,0 +1,16 @@ +import { useRequestQuery } from '../useQueryRequest'; + +/** + * Retrieve the job metadata. + */ +export function useJob(jobId, props = {}) { + return useRequestQuery( + ['JOB', jobId], + { method: 'get', url: `jobs/${jobId}` }, + { + select: (res) => res.data.job, + defaultData: {}, + ...props, + }, + ); +} diff --git a/client/src/hooks/query/organization.js b/client/src/hooks/query/organization.js index 2a70cda75..47824bad8 100644 --- a/client/src/hooks/query/organization.js +++ b/client/src/hooks/query/organization.js @@ -35,7 +35,7 @@ export function useCurrentOrganization(props) { return useRequestQuery( [t.ORGANIZATION_CURRENT], - { method: 'get', url: `organization/current` }, + { method: 'get', url: `organization` }, { select: (res) => res.data.organization, defaultData: {}, @@ -55,37 +55,6 @@ export function useCurrentOrganization(props) { ); } -/** - * Builds the current tenant. - */ -export function useBuildTenant(props) { - const apiRequest = useApiRequest(); - const queryClient = useQueryClient(); - - return useMutation((values) => apiRequest.post('organization/build'), { - onSuccess: (res, values) => { - queryClient.invalidateQueries(t.ORGANIZATION_CURRENT); - queryClient.invalidateQueries(t.ORGANIZATIONS); - }, - ...props, - }); -} - -/** - * Seeds the current tenant - */ -export function useSeedTenant() { - const apiRequest = useApiRequest(); - const queryClient = useQueryClient(); - - return useMutation((values) => apiRequest.post('organization/seed'), { - onSuccess: (res) => { - queryClient.invalidateQueries(t.ORGANIZATION_CURRENT); - queryClient.invalidateQueries(t.ORGANIZATIONS); - }, - }); -} - /** * Organization setup. */ @@ -94,7 +63,7 @@ export function useOrganizationSetup() { const queryClient = useQueryClient(); return useMutation( - (values) => apiRequest.post(`setup/organization`, values), + (values) => apiRequest.post(`organization/build`, values), { onSuccess: (res) => { queryClient.invalidateQueries(t.ORGANIZATION_CURRENT); diff --git a/client/src/store/organizations/organizations.actions.js b/client/src/store/organizations/organizations.actions.js index e49a23393..602a36b22 100644 --- a/client/src/store/organizations/organizations.actions.js +++ b/client/src/store/organizations/organizations.actions.js @@ -8,66 +8,34 @@ export const setOrganizations = (organizations) => { organizations, }, }; -} +}; + +export const fetchOrganizations = () => (dispatch) => + new Promise((resolve, reject) => { + ApiService.get('organization/all') + .then((response) => { + dispatch({ + type: t.ORGANIZATIONS_LIST_SET, + payload: { + organizations: response.data.organizations, + }, + }); + resolve(response); + }) + .catch((error) => { + reject(error); + }); + }); + +export const setOrganizationSetupCompleted = + (congrats) => (dispatch, getState) => { + const organizationId = getState().authentication.organizationId; -export const fetchOrganizations = () => (dispatch) => new Promise((resolve, reject) => { - ApiService.get('organization/all').then((response) => { dispatch({ - type: t.ORGANIZATIONS_LIST_SET, + type: t.SET_ORGANIZATION_CONGRATS, payload: { - organizations: response.data.organizations, + organizationId, + congrats, }, }); - resolve(response) - }).catch(error => { reject(error); }); -}); - -export const buildTenant = () => (dispatch, getState) => new Promise((resolve, reject) => { - const organizationId = getState().authentication.organizationId; - - dispatch({ - type: t.SET_ORGANIZATION_INITIALIZING, - payload: { organizationId } - }); - ApiService.post(`organization/build`).then((response) => { - resolve(response); - dispatch({ - type: t.SET_ORGANIZATION_INITIALIZED, - payload: { organizationId } - }); - }) - .catch((error) => { - reject(error.response.data.errors || []); - }); -}); - -export const seedTenant = () => (dispatch, getState) => new Promise((resolve, reject) => { - const organizationId = getState().authentication.organizationId; - - dispatch({ - type: t.SET_ORGANIZATION_SEEDING, - payload: { organizationId } - }); - ApiService.post(`organization/seed/`).then((response) => { - dispatch({ - type: t.SET_ORGANIZATION_SEEDED, - payload: { organizationId } - }); - resolve(response); - }) - .catch((error) => { - reject(error.response.data.errors || []); - }); -}); - -export const setOrganizationSetupCompleted = (congrats) => (dispatch, getState) => { - const organizationId = getState().authentication.organizationId; - - dispatch({ - type: t.SET_ORGANIZATION_CONGRATS, - payload: { - organizationId, - congrats - }, - }); -}; \ No newline at end of file + }; diff --git a/client/src/store/organizations/organizations.reducers.js b/client/src/store/organizations/organizations.reducers.js index 9dfa28f20..8e904b2b4 100644 --- a/client/src/store/organizations/organizations.reducers.js +++ b/client/src/store/organizations/organizations.reducers.js @@ -24,45 +24,6 @@ const reducer = createReducer(initialState, { state.byOrganizationId = _dataByOrganizationId; }, - [t.SET_ORGANIZATION_SEEDING]: (state, action) => { - const { organizationId } = action.payload; - - state.data[organizationId] = { - ...(state.data[organizationId] || {}), - is_seeding: true, - }; - }, - - [t.SET_ORGANIZATION_SEEDED]: (state, action) => { - const { organizationId } = action.payload; - - state.data[organizationId] = { - ...(state.data[organizationId] || {}), - is_seeding: false, - seeded_at: new Date().toISOString(), - is_ready: true, - }; - }, - - [t.SET_ORGANIZATION_INITIALIZING]: (state, action) => { - const { organizationId } = action.payload; - - state.data[organizationId] = { - ...(state.data[organizationId] || {}), - is_initializing: true, - }; - }, - - [t.SET_ORGANIZATION_INITIALIZED]: (state, action) => { - const { organizationId } = action.payload; - - state.data[organizationId] = { - ...(state.data[organizationId] || {}), - is_initializing: false, - initialized_at: new Date().toISOString(), - }; - }, - [t.SET_ORGANIZATION_CONGRATS]: (state, action) => { const { organizationId, congrats } = action.payload; diff --git a/client/src/store/organizations/organizations.selectors.js b/client/src/store/organizations/organizations.selectors.js index 931ed6f53..63716bdf9 100644 --- a/client/src/store/organizations/organizations.selectors.js +++ b/client/src/store/organizations/organizations.selectors.js @@ -21,20 +21,6 @@ export const isOrganizationBuiltFactory = () => createSelector( }, ); -export const isOrganizationInitializingFactory = () => createSelector( - organizationSelector, - (organization) => { - return organization?.is_initializing; - }, -); - -export const isOrganizationSeedingFactory = () => createSelector( - organizationSelector, - (organization) => { - return organization?.is_seeding; - }, -); - export const isOrganizationReadyFactory = () => createSelector( organizationSelector, (organization) => { @@ -55,3 +41,10 @@ export const isOrganizationCongratsFactory = () => createSelector( return !!organization?.is_congrats; } ); + +export const isOrganizationBuildRunningFactory = () => createSelector( + organizationSelector, + (organization) => { + return !!organization?.is_build_running; + } +) \ No newline at end of file diff --git a/client/src/store/organizations/organizations.types.js b/client/src/store/organizations/organizations.types.js index 25f43f0de..c7efea8a7 100644 --- a/client/src/store/organizations/organizations.types.js +++ b/client/src/store/organizations/organizations.types.js @@ -1,12 +1,5 @@ export default { ORGANIZATIONS_LIST_SET: 'ORGANIZATIONS_LIST_SET', - - SET_ORGANIZATION_SEEDING: 'SET_ORGANIZATION_SEEDING', - SET_ORGANIZATION_SEEDED: 'SET_ORGANIZATION_SEEDED', - - SET_ORGANIZATION_INITIALIZED: 'SET_ORGANIZATION_INITIALIZED', - SET_ORGANIZATION_INITIALIZING: 'SET_ORGANIZATION_INITIALIZING', - SET_ORGANIZATION_CONGRATS: 'SET_ORGANIZATION_CONGRATS' }; \ No newline at end of file diff --git a/client/src/store/organizations/withSetupWizard.js b/client/src/store/organizations/withSetupWizard.js index d0121bd5c..203a200f7 100644 --- a/client/src/store/organizations/withSetupWizard.js +++ b/client/src/store/organizations/withSetupWizard.js @@ -5,28 +5,27 @@ export default (mapState) => { const { isOrganizationSetupCompleted, isOrganizationInitialized, - isOrganizationSeeded, - isSubscriptionActive + isSubscriptionActive, + isOrganizationBuildRunning } = props; const condits = { isCongratsStep: isOrganizationSetupCompleted, isSubscriptionStep: !isSubscriptionActive, - isInitializingStep: isSubscriptionActive && !isOrganizationInitialized, - isOrganizationStep: isOrganizationInitialized && !isOrganizationSeeded, + isInitializingStep: isOrganizationBuildRunning, + isOrganizationStep: !isOrganizationInitialized && !isOrganizationBuildRunning, }; - const scenarios = [ - { condition: condits.isCongratsStep, step: 'congrats' }, { condition: condits.isSubscriptionStep, step: 'subscription' }, - { condition: condits.isInitializingStep, step: 'initializing' }, { condition: condits.isOrganizationStep, step: 'organization' }, + { condition: condits.isInitializingStep, step: 'initializing' }, + { condition: condits.isCongratsStep, step: 'congrats' }, ]; const setupStep = scenarios.find((scenario) => scenario.condition); const mapped = { ...condits, setupStepId: setupStep?.step, - setupStepIndex: scenarios.indexOf(setupStep) , + setupStepIndex: scenarios.indexOf(setupStep) + 1, }; return mapState ? mapState(mapped, state, props) : mapped; }; diff --git a/server/src/api/controllers/Organization.ts b/server/src/api/controllers/Organization.ts index 6cfcf74b4..944593248 100644 --- a/server/src/api/controllers/Organization.ts +++ b/server/src/api/controllers/Organization.ts @@ -59,7 +59,7 @@ export default class OrganizationController extends BaseController { check('organization_name').exists().trim(), check('base_currency').exists().isIn(BASE_CURRENCY), check('timezone').exists(), - check('fiscal_year').exists().isISO8601(), + check('fiscal_year').exists(), check('industry').optional().isString(), check('date_format').optional().isIn(DATE_FORMATS), ]; diff --git a/server/src/database/seeds/core/20200810121809_seed_settings.js b/server/src/database/seeds/core/20200810121809_seed_settings.js index 1eaeec22d..9baca5664 100644 --- a/server/src/database/seeds/core/20200810121809_seed_settings.js +++ b/server/src/database/seeds/core/20200810121809_seed_settings.js @@ -2,40 +2,40 @@ import Container from 'typedi'; import TenancyService from 'services/Tenancy/TenancyService'; exports.up = (knex) => { - const tenancyService = Container.get(TenancyService); - const settings = tenancyService.settings(knex.userParams.tenantId); + // const tenancyService = Container.get(TenancyService); + // const settings = tenancyService.settings(knex.userParams.tenantId); - // Orgnization settings. - settings.set({ group: 'organization', key: 'accounting_basis', value: 'accural' }); + // // Orgnization settings. + // settings.set({ group: 'organization', key: 'accounting_basis', value: 'accural' }); - // Accounts settings. - settings.set({ group: 'accounts', key: 'account_code_unique', value: true }); + // // Accounts settings. + // settings.set({ group: 'accounts', key: 'account_code_unique', value: true }); - // Manual journals settings. - settings.set({ group: 'manual_journals', key: 'next_number', value: '00001' }); - settings.set({ group: 'manual_journals', key: 'auto_increment', value: true }); + // // Manual journals settings. + // settings.set({ group: 'manual_journals', key: 'next_number', value: '00001' }); + // settings.set({ group: 'manual_journals', key: 'auto_increment', value: true }); - // Sale invoices settings. - settings.set({ group: 'sales_invoices', key: 'next_number', value: '00001' }); - settings.set({ group: 'sales_invoices', key: 'number_prefix', value: 'INV-' }); - settings.set({ group: 'sales_invoices', key: 'auto_increment', value: true }); + // // Sale invoices settings. + // settings.set({ group: 'sales_invoices', key: 'next_number', value: '00001' }); + // settings.set({ group: 'sales_invoices', key: 'number_prefix', value: 'INV-' }); + // settings.set({ group: 'sales_invoices', key: 'auto_increment', value: true }); - // Sale receipts settings. - settings.set({ group: 'sales_receipts', key: 'next_number', value: '00001' }); - settings.set({ group: 'sales_receipts', key: 'number_prefix', value: 'REC-' }); - settings.set({ group: 'sales_receipts', key: 'auto_increment', value: true }); + // // Sale receipts settings. + // settings.set({ group: 'sales_receipts', key: 'next_number', value: '00001' }); + // settings.set({ group: 'sales_receipts', key: 'number_prefix', value: 'REC-' }); + // settings.set({ group: 'sales_receipts', key: 'auto_increment', value: true }); - // Sale estimates settings. - settings.set({ group: 'sales_estimates', key: 'next_number', value: '00001' }); - settings.set({ group: 'sales_estimates', key: 'number_prefix', value: 'EST-' }); - settings.set({ group: 'sales_estimates', key: 'auto_increment', value: true }); + // // Sale estimates settings. + // settings.set({ group: 'sales_estimates', key: 'next_number', value: '00001' }); + // settings.set({ group: 'sales_estimates', key: 'number_prefix', value: 'EST-' }); + // settings.set({ group: 'sales_estimates', key: 'auto_increment', value: true }); - // Payment receives settings. - settings.set({ group: 'payment_receives', key: 'number_prefix', value: 'PAY-' }); - settings.set({ group: 'payment_receives', key: 'next_number', value: '00001' }); - settings.set({ group: 'payment_receives', key: 'auto_increment', value: true }); + // // Payment receives settings. + // settings.set({ group: 'payment_receives', key: 'number_prefix', value: 'PAY-' }); + // settings.set({ group: 'payment_receives', key: 'next_number', value: '00001' }); + // settings.set({ group: 'payment_receives', key: 'auto_increment', value: true }); - return settings.save(); + // return settings.save(); }; exports.down = (knex) => {};