2022-03-17 17:16:49 +05:30
|
|
|
import frappe from 'frappe';
|
2022-04-08 11:40:04 +05:30
|
|
|
import NumberSeries from 'frappe/models/NumberSeries';
|
2022-03-17 17:16:49 +05:30
|
|
|
import { getRandomString } from 'frappe/utils';
|
2022-04-08 11:40:04 +05:30
|
|
|
import { BaseError } from 'frappe/utils/errors';
|
|
|
|
import { Field, Schema } from 'schemas/types';
|
|
|
|
import Doc from './doc';
|
|
|
|
|
|
|
|
export function getNumberSeries(schema: Schema): Field | undefined {
|
|
|
|
const numberSeries = schema.fields.find(
|
|
|
|
(f) => f.fieldname === 'numberSeries'
|
|
|
|
);
|
|
|
|
return numberSeries;
|
|
|
|
}
|
2018-03-05 22:15:21 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export function isNameAutoSet(schemaName: string): boolean {
|
|
|
|
const schema = frappe.schemaMap[schemaName]!;
|
|
|
|
if (schema.naming === 'autoincrement') {
|
2022-03-17 17:16:49 +05:30
|
|
|
return true;
|
|
|
|
}
|
2022-02-24 11:39:35 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
const numberSeries = getNumberSeries(schema);
|
2022-03-17 17:16:49 +05:30
|
|
|
if (numberSeries) {
|
|
|
|
return true;
|
|
|
|
}
|
2022-03-08 13:42:08 +05:30
|
|
|
|
2022-03-17 17:16:49 +05:30
|
|
|
return false;
|
|
|
|
}
|
2018-03-05 22:15:21 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export async function setName(doc: Doc) {
|
|
|
|
// if is server, always name again if autoincrement or other
|
|
|
|
if (doc.schema.naming === 'autoincrement') {
|
|
|
|
doc.name = await getNextId(doc.schemaName);
|
|
|
|
return;
|
|
|
|
}
|
2022-03-08 13:42:08 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
// Current, per doc number series
|
|
|
|
const numberSeries = doc.numberSeries as string | undefined;
|
|
|
|
if (numberSeries !== undefined) {
|
|
|
|
doc.name = await getSeriesNext(numberSeries, doc.schemaName);
|
|
|
|
return;
|
2022-03-17 17:16:49 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
if (doc.name) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// name === doctype for Single
|
2022-04-08 11:40:04 +05:30
|
|
|
if (doc.schema.isSingle) {
|
|
|
|
doc.name = doc.schema.name;
|
2022-03-17 17:16:49 +05:30
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// assign a random name by default
|
|
|
|
// override doc to set a name
|
|
|
|
if (!doc.name) {
|
|
|
|
doc.name = getRandomString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export async function getNextId(schemaName: string) {
|
2022-03-17 17:16:49 +05:30
|
|
|
// get the last inserted row
|
2022-04-08 11:40:04 +05:30
|
|
|
const lastInserted = await getLastInserted(schemaName);
|
2022-03-17 17:16:49 +05:30
|
|
|
let name = 1;
|
|
|
|
if (lastInserted) {
|
2022-04-08 11:40:04 +05:30
|
|
|
let lastNumber = parseInt(lastInserted.name as string);
|
2022-03-17 17:16:49 +05:30
|
|
|
if (isNaN(lastNumber)) lastNumber = 0;
|
|
|
|
name = lastNumber + 1;
|
|
|
|
}
|
|
|
|
return (name + '').padStart(9, '0');
|
|
|
|
}
|
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export async function getLastInserted(schemaName: string) {
|
|
|
|
const lastInserted = await frappe.db.getAll(schemaName, {
|
2022-03-17 17:16:49 +05:30
|
|
|
fields: ['name'],
|
|
|
|
limit: 1,
|
2022-04-08 11:40:04 +05:30
|
|
|
orderBy: 'creation',
|
2022-03-17 17:16:49 +05:30
|
|
|
order: 'desc',
|
|
|
|
});
|
|
|
|
return lastInserted && lastInserted.length ? lastInserted[0] : null;
|
|
|
|
}
|
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export async function getSeriesNext(prefix: string, schemaName: string) {
|
|
|
|
let series: NumberSeries;
|
2022-03-17 17:16:49 +05:30
|
|
|
|
|
|
|
try {
|
2022-04-08 11:40:04 +05:30
|
|
|
series = (await frappe.doc.getDoc('NumberSeries', prefix)) as NumberSeries;
|
2022-03-17 17:16:49 +05:30
|
|
|
} catch (e) {
|
2022-04-08 11:40:04 +05:30
|
|
|
const { statusCode } = e as BaseError;
|
|
|
|
if (!statusCode || statusCode !== 404) {
|
2022-03-17 17:16:49 +05:30
|
|
|
throw e;
|
2022-01-21 02:27:29 +05:30
|
|
|
}
|
2022-03-08 13:42:08 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
await createNumberSeries(prefix, schemaName);
|
|
|
|
series = (await frappe.doc.getDoc('NumberSeries', prefix)) as NumberSeries;
|
2022-03-17 17:16:49 +05:30
|
|
|
}
|
2018-03-27 19:25:26 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
return await series.next(schemaName);
|
2022-03-17 17:16:49 +05:30
|
|
|
}
|
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
export async function createNumberSeries(
|
|
|
|
prefix: string,
|
|
|
|
referenceType: string,
|
|
|
|
start = 1001
|
|
|
|
) {
|
2022-03-17 17:16:49 +05:30
|
|
|
const exists = await frappe.db.exists('NumberSeries', prefix);
|
|
|
|
if (exists) {
|
|
|
|
return;
|
|
|
|
}
|
2022-03-08 13:42:08 +05:30
|
|
|
|
2022-04-08 11:40:04 +05:30
|
|
|
const series = frappe.doc.getNewDoc('NumberSeries', {
|
2022-03-17 17:16:49 +05:30
|
|
|
name: prefix,
|
|
|
|
start,
|
|
|
|
referenceType,
|
|
|
|
});
|
2022-03-08 13:42:08 +05:30
|
|
|
|
2022-03-17 17:16:49 +05:30
|
|
|
await series.insert();
|
|
|
|
}
|