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 (
);
}
+
+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) => {};