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 @@ + + +
+ + + + + + + + + + + + +
diff --git a/modules/supplier/front/create/index.js b/modules/supplier/front/create/index.js new file mode 100644 index 000000000..c33367dac --- /dev/null +++ b/modules/supplier/front/create/index.js @@ -0,0 +1,23 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +class Controller extends Section { + constructor($element, $) { + super($element, $); + } + + onSubmit() { + this.$.watcher.submit().then( + json => { + this.$state.go(`supplier.card.fiscalData`, {id: json.data.id}); + } + ); + } +} + +Controller.$inject = ['$element', '$scope']; + +ngModule.vnComponent('vnSupplierCreate', { + template: require('./index.html'), + controller: Controller +}); diff --git a/modules/supplier/front/index.js b/modules/supplier/front/index.js index ba2768854..9216d0781 100644 --- a/modules/supplier/front/index.js +++ b/modules/supplier/front/index.js @@ -20,3 +20,4 @@ import './address/create'; import './address/edit'; import './agency-term/index'; import './agency-term/create'; +import './create/index'; diff --git a/modules/supplier/front/index/index.html b/modules/supplier/front/index/index.html index 87e822eea..49f38cb1b 100644 --- a/modules/supplier/front/index/index.html +++ b/modules/supplier/front/index/index.html @@ -58,4 +58,7 @@ - \ No newline at end of file + + + + \ No newline at end of file diff --git a/modules/supplier/front/index/locale/es.yml b/modules/supplier/front/index/locale/es.yml index ad8a4f0bb..ce06f462c 100644 --- a/modules/supplier/front/index/locale/es.yml +++ b/modules/supplier/front/index/locale/es.yml @@ -2,4 +2,5 @@ Payment deadline: Plazo de pago Pay day: Dia de pago Account: Cuenta Pay method: Metodo de pago -Tax number: Nif \ No newline at end of file +Tax number: Nif +New supplier: Nuevo proveedor \ No newline at end of file diff --git a/modules/supplier/front/routes.json b/modules/supplier/front/routes.json index 61420b40d..75b8213cb 100644 --- a/modules/supplier/front/routes.json +++ b/modules/supplier/front/routes.json @@ -30,7 +30,7 @@ "abstract": true, "component": "vn-supplier", "description": "Suppliers" - }, + }, { "url": "/index?q", "state": "supplier.index", @@ -51,6 +51,13 @@ "params": { "supplier": "$ctrl.supplier" } + }, + { + "url": "/create", + "state": "supplier.create", + "component": "vn-supplier-create", + "acl": ["administrative"], + "description": "New supplier" }, { "url": "/basic-data",