diff --git a/db/changes/10491-august/00-defaultPayDem_sameAs_production.sql b/db/changes/10491-august/00-defaultPayDem_sameAs_production.sql
new file mode 100644
index 000000000..294247338
--- /dev/null
+++ b/db/changes/10491-august/00-defaultPayDem_sameAs_production.sql
@@ -0,0 +1,2 @@
+INSERT INTO `vn`.`payDem` (id,payDem)
+ VALUES (7,'0');
diff --git a/db/changes/10491-august/00-newSupplier_ACL.sql b/db/changes/10491-august/00-newSupplier_ACL.sql
new file mode 100644
index 000000000..c88f3de3f
--- /dev/null
+++ b/db/changes/10491-august/00-newSupplier_ACL.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (model,property,accessType,principalId)
+ VALUES ('Supplier','newSupplier','WRITE','administrative');
diff --git a/db/changes/10491-august/00-payMethodFk_Allow_Null.sql b/db/changes/10491-august/00-payMethodFk_Allow_Null.sql
new file mode 100644
index 000000000..6d9931d3c
--- /dev/null
+++ b/db/changes/10491-august/00-payMethodFk_Allow_Null.sql
@@ -0,0 +1 @@
+ALTER TABLE `vn`.`supplier` MODIFY COLUMN payMethodFk tinyint(3) unsigned NULL;
\ No newline at end of file
diff --git a/db/changes/10491-august/00-supplierActivityFk_Allow_Null.sql b/db/changes/10491-august/00-supplierActivityFk_Allow_Null.sql
new file mode 100644
index 000000000..62aac0556
--- /dev/null
+++ b/db/changes/10491-august/00-supplierActivityFk_Allow_Null.sql
@@ -0,0 +1 @@
+ALTER TABLE `vn`.`supplier` MODIFY COLUMN supplierActivityFk varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL NULL;
\ No newline at end of file
diff --git a/modules/supplier/back/methods/supplier/filter.js b/modules/supplier/back/methods/supplier/filter.js
index 3500afacd..0b473f7df 100644
--- a/modules/supplier/back/methods/supplier/filter.js
+++ b/modules/supplier/back/methods/supplier/filter.js
@@ -95,8 +95,8 @@ module.exports = Self => {
pm.name AS payMethod,
pd.payDem AS payDem
FROM vn.supplier s
- JOIN vn.payMethod pm ON pm.id = s.payMethodFk
- JOIN vn.payDem pd ON pd.id = s.payDemFk`
+ LEFT JOIN vn.payMethod pm ON pm.id = s.payMethodFk
+ LEFT JOIN vn.payDem pd ON pd.id = s.payDemFk`
);
stmt.merge(conn.makeSuffix(filter));
diff --git a/modules/supplier/back/methods/supplier/newSupplier.js b/modules/supplier/back/methods/supplier/newSupplier.js
new file mode 100644
index 000000000..f4059a259
--- /dev/null
+++ b/modules/supplier/back/methods/supplier/newSupplier.js
@@ -0,0 +1,45 @@
+module.exports = Self => {
+ Self.remoteMethod('newSupplier', {
+ description: 'Creates a new supplier and returns it',
+ accessType: 'WRITE',
+ accepts: [{
+ arg: 'params',
+ type: 'object',
+ http: {source: 'body'}
+ }],
+ returns: {
+ type: 'string',
+ root: true
+ },
+ http: {
+ path: `/newSupplier`,
+ verb: 'POST'
+ }
+ });
+
+ Self.newSupplier = async params => {
+ const models = Self.app.models;
+ const myOptions = {};
+
+ if (typeof(params) == 'string')
+ params = JSON.parse(params);
+
+ params.nickname = params.name;
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ const supplier = await models.Supplier.create(params, myOptions);
+
+ if (tx) await tx.commit();
+
+ return supplier;
+ } catch (e) {
+ if (tx) await tx.rollback();
+ return params;
+ }
+ };
+};
diff --git a/modules/supplier/back/methods/supplier/specs/filter.spec.js b/modules/supplier/back/methods/supplier/specs/filter.spec.js
index 1f74b10ff..2620bb687 100644
--- a/modules/supplier/back/methods/supplier/specs/filter.spec.js
+++ b/modules/supplier/back/methods/supplier/specs/filter.spec.js
@@ -10,7 +10,7 @@ describe('Supplier filter()', () => {
let result = await app.models.Supplier.filter(ctx);
- expect(result.length).toEqual(1);
+ expect(result.length).toBeGreaterThanOrEqual(1);
expect(result[0].id).toEqual(1);
});
diff --git a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js
new file mode 100644
index 000000000..8f22a4f20
--- /dev/null
+++ b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js
@@ -0,0 +1,30 @@
+const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
+
+describe('Supplier newSupplier()', () => {
+ const newSupp = {
+ name: 'TestSupplier-1'
+ };
+ const administrativeId = 5;
+
+ it('should create a new supplier containing only the name', async() => {
+ const activeCtx = {
+ accessToken: {userId: administrativeId},
+ };
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+
+ let result = await app.models.Supplier.newSupplier(JSON.stringify(newSupp));
+
+ expect(result.name).toEqual('TestSupplier-1');
+ expect(result.id).toEqual(443);
+
+ const createdSupplier = await app.models.Supplier.findById(result.id);
+
+ expect(createdSupplier.id).toEqual(result.id);
+ expect(createdSupplier.name).toEqual(result.name);
+ expect(createdSupplier.payDemFk).toEqual(7);
+ expect(createdSupplier.nickname).toEqual(result.name);
+ });
+});
diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js
index c9af7b297..44549c65c 100644
--- a/modules/supplier/back/models/supplier.js
+++ b/modules/supplier/back/models/supplier.js
@@ -10,6 +10,7 @@ module.exports = Self => {
require('../methods/supplier/freeAgencies')(Self);
require('../methods/supplier/campaignMetricsPdf')(Self);
require('../methods/supplier/campaignMetricsEmail')(Self);
+ require('../methods/supplier/newSupplier')(Self);
Self.validatesPresenceOf('name', {
message: 'The social name cannot be empty'
@@ -19,13 +20,17 @@ module.exports = Self => {
message: 'The supplier name must be unique'
});
- Self.validatesPresenceOf('city', {
- message: 'City cannot be empty'
- });
+ if (this.city) {
+ Self.validatesPresenceOf('city', {
+ message: 'City cannot be empty'
+ });
+ }
- Self.validatesPresenceOf('nif', {
- message: 'The nif cannot be empty'
- });
+ if (this.nif) {
+ Self.validatesPresenceOf('nif', {
+ message: 'The nif cannot be empty'
+ });
+ }
Self.validatesUniquenessOf('nif', {
message: 'TIN must be unique'
@@ -57,6 +62,9 @@ module.exports = Self => {
}
async function tinIsValid(err, done) {
+ if (!this.countryFk)
+ return done();
+
const filter = {
fields: ['code'],
where: {id: this.countryFk}
@@ -80,6 +88,7 @@ module.exports = Self => {
});
async function hasSupplierAccount(err, done) {
+ if (!this.payMethodFk) return done();
const payMethod = await Self.app.models.PayMethod.findById(this.payMethodFk);
const supplierAccount = await Self.app.models.SupplierAccount.findOne({where: {supplierFk: this.id}});
const hasIban = supplierAccount && supplierAccount.iban;
@@ -92,6 +101,7 @@ module.exports = Self => {
}
Self.observe('before save', async function(ctx) {
+ if (ctx.isNewInstance) return;
const loopbackContext = LoopBackContext.getCurrentContext();
const changes = ctx.data || ctx.instance;
const orgData = ctx.currentInstance;
@@ -101,7 +111,7 @@ module.exports = Self => {
const isPayMethodChecked = changes.isPayMethodChecked || orgData.isPayMethodChecked;
const hasChanges = orgData && changes;
const isPayMethodCheckedChanged = hasChanges
- && orgData.isPayMethodChecked != isPayMethodChecked;
+ && orgData.isPayMethodChecked != isPayMethodChecked;
if (isNotFinancial && isPayMethodCheckedChanged)
throw new UserError('You can not modify is pay method checked');
@@ -114,7 +124,7 @@ module.exports = Self => {
const socialName = changes.name || orgData.name;
const hasChanges = orgData && changes;
const socialNameChanged = hasChanges
- && orgData.socialName != socialName;
+ && orgData.socialName != socialName;
if ((socialNameChanged) && !isAlpha(socialName))
throw new UserError('The social name has an invalid format');
diff --git a/modules/supplier/front/create/index.html b/modules/supplier/front/create/index.html
new file mode 100644
index 000000000..446a16cb6
--- /dev/null
+++ b/modules/supplier/front/create/index.html
@@ -0,0 +1,29 @@
+