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/db/changes/10491-august/ticket_closeByTicket.sql b/db/changes/10491-august/00-ticket_closeByTicket.sql
similarity index 85%
rename from db/changes/10491-august/ticket_closeByTicket.sql
rename to db/changes/10491-august/00-ticket_closeByTicket.sql
index 25b04f629..f378b1146 100644
--- a/db/changes/10491-august/ticket_closeByTicket.sql
+++ b/db/changes/10491-august/00-ticket_closeByTicket.sql
@@ -1,7 +1,9 @@
drop procedure `vn`.`ticket_closeByTicket`;
+DELIMITER $$
+$$
create
- definer = root@localhost procedure `vn`.`ticket_closeByTicket`(IN vTicketFk int)
+ definer = `root`@`localhost` procedure `vn`.`ticket_closeByTicket`(IN vTicketFk int)
BEGIN
/**
@@ -27,5 +29,7 @@ BEGIN
CALL ticket_close();
DROP TEMPORARY TABLE tmp.ticket_close;
-END;
+END$$
+DELIMITER ;
+
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 59c9338a4..8007667e7 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -1380,13 +1380,6 @@ INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'Movement 7', 0, 0, 'this is the note seven', 'observation seven'),
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'Movement 8', 1, 1, '', '');
-INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate`)
- VALUES
- (1101, 500, NULL, 0.00, 0.00, 1.00),
- (1102, 1000, 2.00, 0.01, 0.05, 1.00),
- (1103, 2000, 0.00, 0.00, 0.02, 1.00),
- (1104, 2500, 150.00, 0.02, 0.10, 1.00);
-
INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`)
VALUES
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation', 1, 1, '1062', '51', '4.8'),
@@ -1743,12 +1736,12 @@ INSERT INTO `vn`.`claimState`(`id`, `code`, `description`, `roleFk`, `priority`,
( 6, 'mana', 'Mana', 1, 4, 0),
( 7, 'lack', 'Faltas', 1, 2, 0);
-INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`)
+INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `rma`)
VALUES
- (1, util.VN_CURDATE(), 1, 1101, 18, 3, 0, util.VN_CURDATE(), 0),
- (2, util.VN_CURDATE(), 2, 1101, 18, 3, 0, util.VN_CURDATE(), 1),
- (3, util.VN_CURDATE(), 3, 1101, 18, 1, 1, util.VN_CURDATE(), 5),
- (4, util.VN_CURDATE(), 3, 1104, 18, 5, 0, util.VN_CURDATE(), 10);
+ (1, util.VN_CURDATE(), 1, 1101, 18, 3, 0, util.VN_CURDATE(), 0, '02676A049183'),
+ (2, util.VN_CURDATE(), 2, 1101, 18, 3, 0, util.VN_CURDATE(), 1, NULL),
+ (3, util.VN_CURDATE(), 3, 1101, 18, 1, 1, util.VN_CURDATE(), 5, NULL),
+ (4, util.VN_CURDATE(), 3, 1104, 18, 5, 0, util.VN_CURDATE(), 10, NULL);
INSERT INTO `vn`.`claimObservation` (`claimFk`, `workerFk`, `text`, `created`)
VALUES
@@ -1790,6 +1783,23 @@ INSERT INTO `vn`.`claimConfig`(`id`, `pickupContact`, `maxResponsibility`)
(1, 'Contact description', 50),
(2, 'Contact description', 30);
+INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate`)
+ VALUES
+ (1101, 500, NULL, 0.00, 0.00, 1.00),
+ (1102, 1000, 2.00, 0.01, 0.05, 1.00),
+ (1103, 2000, 0.00, 0.00, 0.02, 1.00),
+ (1104, 2500, 150.00, 0.02, 0.10, 1.00);
+
+INSERT INTO vn.claimRma (`id`, `code`, `created`, `workerFk`)
+VALUES
+ (1, '02676A049183', DEFAULT, 1106),
+ (2, '02676A049183', DEFAULT, 1106),
+ (3, '02676A049183', DEFAULT, 1107),
+ (4, '02676A049183', DEFAULT, 1107),
+ (5, '01837B023653', DEFAULT, 1106);
+
+
+
INSERT INTO `hedera`.`tpvMerchant`(`id`, `description`, `companyFk`, `bankFk`, `secretKey`)
VALUES
(1, 'Arkham Bank', 442, 1, 'h12387193H10238'),
diff --git a/modules/claim/back/models/claim-rma.js b/modules/claim/back/models/claim-rma.js
new file mode 100644
index 000000000..6a93613bd
--- /dev/null
+++ b/modules/claim/back/models/claim-rma.js
@@ -0,0 +1,9 @@
+const LoopBackContext = require('loopback-context');
+
+module.exports = Self => {
+ Self.observe('before save', async function(ctx) {
+ const changes = ctx.data || ctx.instance;
+ const loopBackContext = LoopBackContext.getCurrentContext();
+ changes.workerFk = loopBackContext.active.accessToken.userId;
+ });
+};
diff --git a/modules/claim/back/models/claim-rma.json b/modules/claim/back/models/claim-rma.json
index 24c17a234..e3849422c 100644
--- a/modules/claim/back/models/claim-rma.json
+++ b/modules/claim/back/models/claim-rma.json
@@ -23,7 +23,7 @@
"relations": {
"worker": {
"type": "belongsTo",
- "model": "worker",
+ "model": "Worker",
"foreignKey": "workerFk"
}
}
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 @@
+