WIP Make journal entries page.

This commit is contained in:
Ahmed Bouhuolia
2020-04-07 16:44:50 +02:00
parent 490979ded5
commit aed7df7931
11 changed files with 144 additions and 58 deletions

View File

@@ -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();
});

View File

@@ -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,

View File

@@ -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()