mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 22:00:31 +00:00
WIP Make journal entries page.
This commit is contained in:
@@ -3,11 +3,12 @@ exports.up = function(knex) {
|
||||
return knex.schema.createTable('manual_journals', (table) => {
|
||||
table.increments();
|
||||
table.string('journal_number');
|
||||
table.string('reference');
|
||||
table.string('transaction_type');
|
||||
table.decimal('amount');
|
||||
table.date('date');
|
||||
table.boolean('status').defaultTo(false);
|
||||
table.string('note');
|
||||
table.string('description');
|
||||
table.integer('user_id').unsigned();
|
||||
table.timestamps();
|
||||
});
|
||||
|
||||
@@ -126,9 +126,11 @@ export default {
|
||||
makeJournalEntries: {
|
||||
validation: [
|
||||
check('date').isISO8601(),
|
||||
check('reference').exists(),
|
||||
check('memo').optional().trim().escape(),
|
||||
check('entries').isArray({ min: 1 }),
|
||||
check('journal_number').exists().trim().escape(),
|
||||
check('transaction_type').optional({ nullable: true }).trim().escape(),
|
||||
check('reference').optional({ nullable: true }),
|
||||
check('description').optional().trim().escape(),
|
||||
check('entries').isArray({ min: 2 }),
|
||||
check('entries.*.credit').optional({ nullable: true }).isNumeric().toInt(),
|
||||
check('entries.*.debit').optional({ nullable: true }).isNumeric().toInt(),
|
||||
check('entries.*.account_id').isNumeric().toInt(),
|
||||
@@ -144,6 +146,8 @@ export default {
|
||||
}
|
||||
const form = {
|
||||
date: new Date(),
|
||||
transaction_type: 'journal',
|
||||
reference: '',
|
||||
...req.body,
|
||||
};
|
||||
|
||||
@@ -183,10 +187,11 @@ export default {
|
||||
errorReasons.push({ type: 'ACCOUNTS.IDS.NOT.FOUND', code: 200 });
|
||||
}
|
||||
|
||||
const journalReference = await ManualJournal.query().where('reference', form.reference);
|
||||
const journalNumber = await ManualJournal.query()
|
||||
.where('journal_number', form.journal_number);
|
||||
|
||||
if (journalReference.length > 0) {
|
||||
errorReasons.push({ type: 'REFERENCE.ALREADY.EXISTS', code: 300 });
|
||||
if (journalNumber.length > 0) {
|
||||
errorReasons.push({ type: 'JOURNAL.NUMBER.ALREADY.EXISTS', code: 300 });
|
||||
}
|
||||
if (errorReasons.length > 0) {
|
||||
return res.status(400).send({ errors: errorReasons });
|
||||
@@ -196,9 +201,10 @@ export default {
|
||||
const manualJournal = await ManualJournal.query().insert({
|
||||
reference: form.reference,
|
||||
transaction_type: 'Journal',
|
||||
journal_number: form.journal_number,
|
||||
amount: totalCredit,
|
||||
date: formattedDate,
|
||||
note: form.memo,
|
||||
description: form.description,
|
||||
user_id: user.id,
|
||||
});
|
||||
const journalPoster = new JournalPoster();
|
||||
@@ -210,7 +216,8 @@ export default {
|
||||
debit: entry.debit,
|
||||
credit: entry.credit,
|
||||
account: account.id,
|
||||
transactionType: 'Journal',
|
||||
referenceType: 'Journal',
|
||||
referenceId: manualJournal.id,
|
||||
accountNormal: account.type.normal,
|
||||
note: entry.note,
|
||||
date: formattedDate,
|
||||
|
||||
@@ -18,7 +18,7 @@ describe('routes: `/accounting`', () => {
|
||||
loginRes = null;
|
||||
});
|
||||
|
||||
describe('route: `/accounting/make-journal-entries`', async () => {
|
||||
describe.only('route: `/accounting/make-journal-entries`', async () => {
|
||||
it('Should sumation of credit or debit does not equal zero.', async () => {
|
||||
const account = await create('account');
|
||||
const res = await request()
|
||||
@@ -26,6 +26,7 @@ describe('routes: `/accounting`', () => {
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date().toISOString(),
|
||||
journal_number: '123',
|
||||
reference: 'ASC',
|
||||
entries: [
|
||||
{
|
||||
@@ -54,7 +55,7 @@ describe('routes: `/accounting`', () => {
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date().toISOString(),
|
||||
reference: 'ASC',
|
||||
journal_number: '123',
|
||||
entries: [
|
||||
{
|
||||
credit: 1000,
|
||||
@@ -85,7 +86,7 @@ describe('routes: `/accounting`', () => {
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date().toISOString(),
|
||||
reference: manualJournal.reference,
|
||||
journal_number: manualJournal.journalNumber,
|
||||
entries: [
|
||||
{
|
||||
credit: 1000,
|
||||
@@ -102,18 +103,18 @@ describe('routes: `/accounting`', () => {
|
||||
|
||||
expect(res.status).equals(400);
|
||||
expect(res.body.errors).include.something.that.deep.equal({
|
||||
type: 'REFERENCE.ALREADY.EXISTS',
|
||||
type: 'JOURNAL.NUMBER.ALREADY.EXISTS',
|
||||
code: 300,
|
||||
});
|
||||
});
|
||||
|
||||
it('Should response error in case account id not exists.', async () => {
|
||||
it('Should response error in case account id not exists in one of the given entries.', async () => {
|
||||
const res = await request()
|
||||
.post('/api/accounting/make-journal-entries')
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date().toISOString(),
|
||||
reference: '1000',
|
||||
journal_number: '123',
|
||||
entries: [
|
||||
{
|
||||
credit: 1000,
|
||||
@@ -144,7 +145,7 @@ describe('routes: `/accounting`', () => {
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date().toISOString(),
|
||||
reference: '1000',
|
||||
journal_number: '1000',
|
||||
entries: [
|
||||
{
|
||||
credit: null,
|
||||
@@ -166,7 +167,7 @@ describe('routes: `/accounting`', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('Should store manual journal transaction to the storage.', async () => {
|
||||
it.only('Should store manual journal transaction to the storage.', async () => {
|
||||
const account1 = await create('account');
|
||||
const account2 = await create('account');
|
||||
|
||||
@@ -175,8 +176,9 @@ describe('routes: `/accounting`', () => {
|
||||
.set('x-access-token', loginRes.body.token)
|
||||
.send({
|
||||
date: new Date('2020-2-2').toISOString(),
|
||||
reference: '1000',
|
||||
memo: 'Description here.',
|
||||
journal_number: '1000',
|
||||
reference: '2000',
|
||||
description: 'Description here.',
|
||||
entries: [
|
||||
{
|
||||
credit: 1000,
|
||||
@@ -192,12 +194,14 @@ describe('routes: `/accounting`', () => {
|
||||
const foundManualJournal = await ManualJournal.query();
|
||||
|
||||
expect(foundManualJournal.length).equals(1);
|
||||
expect(foundManualJournal[0].reference).equals('1000');
|
||||
|
||||
expect(foundManualJournal[0].reference).equals('2000');
|
||||
expect(foundManualJournal[0].journalNumber).equals('1000');
|
||||
expect(foundManualJournal[0].transactionType).equals('Journal');
|
||||
expect(foundManualJournal[0].amount).equals(1000);
|
||||
expect(moment(foundManualJournal[0].date).format('YYYY-MM-DD')).equals('2020-02-02');
|
||||
expect(foundManualJournal[0].note).equals('Description here.');
|
||||
expect(foundManualJournal[0].userId).equals(1);
|
||||
expect(foundManualJournal[0].description).equals('Description here.');
|
||||
expect(foundManualJournal[0].userId).to.be.a('integer');
|
||||
});
|
||||
|
||||
it('Should store journal transactions to the storage.', async () => {
|
||||
@@ -246,7 +250,7 @@ describe('routes: `/accounting`', () => {
|
||||
});
|
||||
|
||||
|
||||
describe.only('route: `accounting/manual-journals`', async () => {
|
||||
describe('route: `accounting/manual-journals`', async () => {
|
||||
|
||||
it('Should retrieve manual journals resource not found.', async () => {
|
||||
const res = await request()
|
||||
|
||||
Reference in New Issue
Block a user