diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6adcf94f3..75e807a7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [2322.01] - 2023-06-08
+## [2324.01] - 2023-06-08
+
+### Added
+-
+
+
+### Changed
+-
+
+### Fixed
+-
+
+
+
+## [2322.01] - 2023-06-01
### Added
- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente
diff --git a/back/methods/image/download.js b/back/methods/image/download.js
index 3a8bcf30e..c4037b809 100644
--- a/back/methods/image/download.js
+++ b/back/methods/image/download.js
@@ -67,7 +67,7 @@ module.exports = Self => {
if (!image) return false;
- const hasReadRole = models.ImageCollection.hasReadRole(ctx, collection);
+ const hasReadRole = await models.ImageCollection.hasReadRole(ctx, collection);
if (!hasReadRole)
throw new UserError(`You don't have enough privileges`);
diff --git a/back/models/dms-type.json b/back/models/dms-type.json
index c7a1815fe..de3d564b4 100644
--- a/back/models/dms-type.json
+++ b/back/models/dms-type.json
@@ -44,4 +44,4 @@
"principalId": "$everyone",
"permission": "ALLOW"
}]
-}
\ No newline at end of file
+}
diff --git a/back/models/image-collection.js b/back/models/image-collection.js
index 2c4d274ee..69905beca 100644
--- a/back/models/image-collection.js
+++ b/back/models/image-collection.js
@@ -9,10 +9,11 @@ module.exports = Self => {
* @return {boolean} True for user with read privileges
*/
Self.hasReadRole = async(ctx, name, options) => {
- const collection = await Self.findOne({where: {name}}, {
+ const collection = await Self.findOne({
include: {
relation: 'readRole'
- }
+ },
+ where: {name}
}, options);
return await hasRole(ctx, collection, options);
diff --git a/db/changes/230202/00-itemConfig.sql b/db/.archive/230202/00-itemConfig.sql
similarity index 100%
rename from db/changes/230202/00-itemConfig.sql
rename to db/.archive/230202/00-itemConfig.sql
diff --git a/db/changes/230401/00-ACL.sql b/db/.archive/230401/00-ACL.sql
similarity index 100%
rename from db/changes/230401/00-ACL.sql
rename to db/.archive/230401/00-ACL.sql
diff --git a/db/changes/230401/00-ACL_tag_update.sql b/db/.archive/230401/00-ACL_tag_update.sql
similarity index 100%
rename from db/changes/230401/00-ACL_tag_update.sql
rename to db/.archive/230401/00-ACL_tag_update.sql
diff --git a/db/changes/230401/00-createWorker.sql b/db/.archive/230401/00-createWorker.sql
similarity index 100%
rename from db/changes/230401/00-createWorker.sql
rename to db/.archive/230401/00-createWorker.sql
diff --git a/db/changes/230401/00-ticket_canAdvance.sql b/db/.archive/230401/00-ticket_canAdvance.sql
similarity index 100%
rename from db/changes/230401/00-ticket_canAdvance.sql
rename to db/.archive/230401/00-ticket_canAdvance.sql
diff --git a/db/changes/230401/00-updateIsToBeMailed.sql b/db/.archive/230401/00-updateIsToBeMailed.sql
similarity index 100%
rename from db/changes/230401/00-updateIsToBeMailed.sql
rename to db/.archive/230401/00-updateIsToBeMailed.sql
diff --git a/db/changes/230403/00-clienteCompensado.sql b/db/.archive/230403/00-clienteCompensado.sql
similarity index 100%
rename from db/changes/230403/00-clienteCompensado.sql
rename to db/.archive/230403/00-clienteCompensado.sql
diff --git a/db/changes/230404/00-ticket_canAdvance.sql b/db/.archive/230404/00-ticket_canAdvance.sql
similarity index 100%
rename from db/changes/230404/00-ticket_canAdvance.sql
rename to db/.archive/230404/00-ticket_canAdvance.sql
diff --git a/db/changes/230601/00-acl_claim.sql b/db/.archive/230601/00-acl_claim.sql
similarity index 100%
rename from db/changes/230601/00-acl_claim.sql
rename to db/.archive/230601/00-acl_claim.sql
diff --git a/db/changes/230601/00-acl_notifications.sql b/db/.archive/230601/00-acl_notifications.sql
similarity index 100%
rename from db/changes/230601/00-acl_notifications.sql
rename to db/.archive/230601/00-acl_notifications.sql
diff --git a/db/changes/230601/00-itemConfig_warehouseFk.sql b/db/.archive/230601/00-itemConfig_warehouseFk.sql
similarity index 100%
rename from db/changes/230601/00-itemConfig_warehouseFk.sql
rename to db/.archive/230601/00-itemConfig_warehouseFk.sql
diff --git a/db/changes/230601/00-uniqueKeyNotificationSubscription.sql b/db/.archive/230601/00-uniqueKeyNotificationSubscription.sql
similarity index 100%
rename from db/changes/230601/00-uniqueKeyNotificationSubscription.sql
rename to db/.archive/230601/00-uniqueKeyNotificationSubscription.sql
diff --git a/db/changes/230601/01-alter_notSubs.sql b/db/.archive/230601/01-alter_notSubs.sql
similarity index 100%
rename from db/changes/230601/01-alter_notSubs.sql
rename to db/.archive/230601/01-alter_notSubs.sql
diff --git a/db/changes/230801/00-acl_itemConfig.sql b/db/.archive/230801/00-acl_itemConfig.sql
similarity index 100%
rename from db/changes/230801/00-acl_itemConfig.sql
rename to db/.archive/230801/00-acl_itemConfig.sql
diff --git a/db/changes/230801/00-supplierIsVies.sql b/db/.archive/230801/00-supplierIsVies.sql
similarity index 100%
rename from db/changes/230801/00-supplierIsVies.sql
rename to db/.archive/230801/00-supplierIsVies.sql
diff --git a/db/changes/230801/00-workerLocker.sql b/db/.archive/230801/00-workerLocker.sql
similarity index 100%
rename from db/changes/230801/00-workerLocker.sql
rename to db/.archive/230801/00-workerLocker.sql
diff --git a/db/changes/230801/01-sage_supplierAdd.sql b/db/.archive/230801/01-sage_supplierAdd.sql
similarity index 100%
rename from db/changes/230801/01-sage_supplierAdd.sql
rename to db/.archive/230801/01-sage_supplierAdd.sql
diff --git a/db/changes/231001/00-delivery.sql b/db/.archive/231001/00-delivery.sql
similarity index 100%
rename from db/changes/231001/00-delivery.sql
rename to db/.archive/231001/00-delivery.sql
diff --git a/db/changes/231001/00-invoiceOut.sql b/db/.archive/231001/00-invoiceOut.sql
similarity index 100%
rename from db/changes/231001/00-invoiceOut.sql
rename to db/.archive/231001/00-invoiceOut.sql
diff --git a/db/changes/231001/00-invoiceOut_getWeight.sql b/db/.archive/231001/00-invoiceOut_getWeight.sql
similarity index 100%
rename from db/changes/231001/00-invoiceOut_getWeight.sql
rename to db/.archive/231001/00-invoiceOut_getWeight.sql
diff --git a/db/changes/231001/00-report.sql b/db/.archive/231001/00-report.sql
similarity index 100%
rename from db/changes/231001/00-report.sql
rename to db/.archive/231001/00-report.sql
diff --git a/db/changes/231001/01-invoiceOut_getMaxIssued.sql b/db/.archive/231001/01-invoiceOut_getMaxIssued.sql
similarity index 100%
rename from db/changes/231001/01-invoiceOut_getMaxIssued.sql
rename to db/.archive/231001/01-invoiceOut_getMaxIssued.sql
diff --git a/db/changes/231001/02-invoiceOut_new.sql b/db/.archive/231001/02-invoiceOut_new.sql
similarity index 100%
rename from db/changes/231001/02-invoiceOut_new.sql
rename to db/.archive/231001/02-invoiceOut_new.sql
diff --git a/db/changes/231001/03-ticketPackaging_add.sql b/db/.archive/231001/03-ticketPackaging_add.sql
similarity index 100%
rename from db/changes/231001/03-ticketPackaging_add.sql
rename to db/.archive/231001/03-ticketPackaging_add.sql
diff --git a/db/changes/231801/00-client_setRatingAcl.sql b/db/changes/231801/00-client_setRatingAcl.sql
index b041b131a..6687b11ec 100644
--- a/db/changes/231801/00-client_setRatingAcl.sql
+++ b/db/changes/231801/00-client_setRatingAcl.sql
@@ -27,7 +27,6 @@ INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalTyp
('Client', 'summary', '*', 'ALLOW', 'ROLE', 'employee'),
('Client', 'updateAddress', '*', 'ALLOW', 'ROLE', 'employee'),
('Client', 'updateFiscalData', '*', 'ALLOW', 'ROLE', 'employee'),
- ('Client', 'updateUser', '*', 'ALLOW', 'ROLE', 'employee'),
('Client', 'uploadFile', '*', 'ALLOW', 'ROLE', 'employee'),
('Client', 'campaignMetricsPdf', '*', 'ALLOW', 'ROLE', 'employee'),
('Client', 'campaignMetricsEmail', '*', 'ALLOW', 'ROLE', 'employee'),
diff --git a/db/changes/232201/.gitkeep b/db/changes/232401/.gitkeep
similarity index 100%
rename from db/changes/232201/.gitkeep
rename to db/changes/232401/.gitkeep
diff --git a/db/changes/232401/00-useSpecificsAcls.sql b/db/changes/232401/00-useSpecificsAcls.sql
new file mode 100644
index 000000000..0d17ca948
--- /dev/null
+++ b/db/changes/232401/00-useSpecificsAcls.sql
@@ -0,0 +1,121 @@
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Ticket', 'editDiscount', 'WRITE', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Ticket', 'editDiscount', 'WRITE', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Ticket', 'isRoleAdvanced', '*', 'ALLOW', 'ROLE', 'salesAssistant'),
+ ('Ticket', 'isRoleAdvanced', '*', 'ALLOW', 'ROLE', 'deliveryBoss'),
+ ('Ticket', 'isRoleAdvanced', '*', 'ALLOW', 'ROLE', 'buyer'),
+ ('Ticket', 'isRoleAdvanced', '*', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Ticket', 'deleteTicketWithPartPrepared', 'WRITE', 'ALLOW', 'ROLE', 'salesAssistant'),
+ ('Ticket', 'editZone', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'),
+ ('State', 'editableStates', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('State', 'seeEditableStates', 'READ', 'ALLOW', 'ROLE', 'administrative'),
+ ('State', 'seeEditableStates', 'READ', 'ALLOW', 'ROLE', 'production'),
+ ('State', 'isSomeEditable', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('State', 'isAllEditable', 'READ', 'ALLOW', 'ROLE', 'production'),
+ ('State', 'isAllEditable', 'READ', 'ALLOW', 'ROLE', 'administrative'),
+ ('Agency', 'seeExpired', 'READ', 'ALLOW', 'ROLE', 'administrative'),
+ ('Agency', 'seeExpired', 'READ', 'ALLOW', 'ROLE', 'productionBoss'),
+ ('Claim', 'createAfterDeadline', 'WRITE', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Client', 'editAddressLogifloraAllowed', 'WRITE', 'ALLOW', 'ROLE', 'salesAssistant'),
+ ('Client', 'editFiscalDataWithoutTaxDataCheck', 'WRITE', 'ALLOW', 'ROLE', 'salesAssistant'),
+ ('Client', 'editVerifiedDataWithoutTaxDataCheck', 'WRITE', 'ALLOW', 'ROLE', 'salesAssistant'),
+ ('Client', 'editCredit', 'WRITE', 'ALLOW', 'ROLE', 'financialBoss'),
+ ('Client', 'isNotEditableCredit', 'WRITE', 'ALLOW', 'ROLE', 'financialBoss'),
+ ('InvoiceOut', 'canCreatePdf', 'WRITE', 'ALLOW', 'ROLE', 'invoicing'),
+ ('Supplier', 'editPayMethodCheck', 'WRITE', 'ALLOW', 'ROLE', 'financial'),
+ ('Worker', 'isTeamBoss', 'WRITE', 'ALLOW', 'ROLE', 'teamBoss'),
+ ('Worker', 'forceIsSubordinate', 'READ', 'ALLOW', 'ROLE', 'hr'),
+ ('Claim', 'editState', 'WRITE', 'ALLOW', 'ROLE', 'claimManager');
+
+DELETE FROM `salix`.`ACL`
+ WHERE
+ model = 'Claim'
+ AND property = '*'
+ AND accessType = '*';
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Claim', 'find', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'findById', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'findOne', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'getSummary', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'updateClaim', 'WRITE', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'regularizeClaim', 'WRITE', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Claim', 'updateClaimDestination', 'WRITE', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Claim', 'downloadFile', 'READ', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Claim', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'claimManager'),
+ ('Claim', 'filter', 'READ', 'ALLOW', 'ROLE', 'salesPerson'),
+ ('Claim', 'logs', 'READ', 'ALLOW', 'ROLE', 'claimManager');
+
+DELETE FROM `salix`.`ACL`
+ WHERE
+ model = 'Ticket'
+ AND property = '*'
+ AND accessType = '*';
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Ticket', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'findById', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'findOne', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'getVolume', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'getTotalVolume', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'summary', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'priceDifference', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'componentUpdate', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'new', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'isEditable', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'setDeleted', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'restore', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'getSales', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'getSalesPersonMana', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'filter', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'makeInvoice', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'updateEditableTicket', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'updateDiscount', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'transferSales', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'sendSms', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'isLocked', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'freightCost', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'getComponentsSum', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Ticket', 'updateAttributes', 'WRITE', 'ALLOW', 'ROLE', 'delivery'), -- Change Priority in Route tickets
+ ('Ticket', 'deliveryNoteCsv', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+DELETE FROM `salix`.`ACL`
+ WHERE
+ model = 'State'
+ AND property = '*'
+ AND accessType = 'READ';
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('State', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('State', 'findById', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('State', 'findOne', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+DELETE FROM `salix`.`ACL`
+ WHERE
+ model = 'Worker'
+ AND property = '*'
+ AND accessType = 'READ';
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES
+ ('Worker', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'findById', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'findOne', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'filter', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'getWorkedHours', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'active', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'activeWithRole', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'uploadFile', 'WRITE', 'ALLOW', 'ROLE', 'hr'),
+ ('Worker', 'contracts', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'holidays', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'activeContract', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('Worker', 'activeWithInheritedRole', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+DELETE FROM `salix`.`ACL`
+ WHERE model = 'Client'
+ AND property = 'updateUser'
+ AND accessType = '*';
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 1304a6ec7..15fa96a79 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -2332,26 +2332,26 @@ INSERT INTO `vn`.`workerTimeControl`(`userFk`, `timed`, `manual`, `direction`, `
INSERT INTO `vn`.`dmsType`(`id`, `name`, `path`, `readRoleFk`, `writeRoleFk`, `code`)
VALUES
- (1, 'Facturas Recibidas', 'recibidas', NULL, NULL, 'invoiceIn'),
- (2, 'Doc oficial', 'oficial', NULL, NULL, 'officialDoc'),
- (3, 'Laboral', 'laboral', 37, 37, 'hhrrData'),
- (4, 'Albaranes recibidos', 'entradas', NULL, NULL, 'deliveryNote'),
- (5, 'Otros', 'otros', 1, 1, 'miscellaneous'),
- (6, 'Pruebas', 'pruebas', NULL, NULL, 'tests'),
- (7, 'IAE Clientes', 'IAE_Clientes', 1, 1, 'economicActivitiesTax'),
- (8, 'Fiscal', 'fiscal', NULL, NULL, 'fiscal'),
- (9, 'Vehiculos', 'vehiculos', NULL, NULL, 'vehicles'),
- (10, 'Plantillas', 'plantillas', NULL, NULL, 'templates'),
- (11, 'Contratos', 'contratos', NULL, NULL, 'contracts'),
- (12, 'ley de pagos', 'ley pagos', 1, 1, 'paymentsLaw'),
- (13, 'Basura', 'basura', 1, 1, 'trash'),
- (14, 'Ticket', 'tickets', 1, 1, 'ticket'),
- (15, 'Presupuestos', 'Presupuestos', NULL, NULL, 'budgets'),
- (16, 'Logistica', 'logistica', NULL, NULL, 'logistics'),
- (17, 'cmr', 'cmr', NULL, NULL, 'cmr'),
- (18, 'dua', 'dua', NULL, NULL, 'dua'),
- (19, 'inmovilizado', 'inmovilizado', NULL, NULL, 'fixedAssets'),
- (20, 'Reclamación', 'reclamacion', 1, 1, 'claim');
+ (1, 'Facturas Recibidas', 'recibidas', NULL, NULL, 'invoiceIn'),
+ (2, 'Doc oficial', 'oficial', NULL, NULL, 'officialDoc'),
+ (3, 'Laboral', 'laboral', 37, 37, 'hhrrData'),
+ (4, 'Albaranes recibidos', 'entradas', NULL, NULL, 'deliveryNote'),
+ (5, 'Otros', 'otros', 1, 1, 'miscellaneous'),
+ (6, 'Pruebas', 'pruebas', NULL, NULL, 'tests'),
+ (7, 'IAE Clientes', 'IAE_Clientes', 1, 1, 'economicActivitiesTax'),
+ (8, 'Fiscal', 'fiscal', NULL, NULL, 'fiscal'),
+ (9, 'Vehiculos', 'vehiculos', NULL, NULL, 'vehicles'),
+ (10, 'Plantillas', 'plantillas', NULL, NULL, 'templates'),
+ (11, 'Contratos', 'contratos', NULL, NULL, 'contracts'),
+ (12, 'ley de pagos', 'ley pagos', 1, 1, 'paymentsLaw'),
+ (13, 'Basura', 'basura', 1, 1, 'trash'),
+ (14, 'Ticket', 'tickets', 1, 1, 'ticket'),
+ (15, 'Presupuestos', 'Presupuestos', NULL, NULL, 'budgets'),
+ (16, 'Logistica', 'logistica', NULL, NULL, 'logistics'),
+ (17, 'cmr', 'cmr', NULL, NULL, 'cmr'),
+ (18, 'dua', 'dua', NULL, NULL, 'dua'),
+ (19, 'inmovilizado', 'inmovilizado', NULL, NULL, 'fixedAssets'),
+ (20, 'Reclamación', 'reclamacion', 1, 1, 'claim');
INSERT INTO `vn`.`dms`(`id`, `dmsTypeFk`, `file`, `contentType`, `workerFk`, `warehouseFk`, `companyFk`, `hardCopyNumber`, `hasFile`, `reference`, `description`, `created`)
VALUES
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 086909ebf..dcd9211f9 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -625,6 +625,7 @@ export default {
selectAllSalesCheckbox: 'vn-ticket-sale vn-thead vn-check',
secondSaleCheckbox: 'vn-ticket-sale vn-tr:nth-child(2) vn-check[ng-model="sale.checked"]',
thirdSaleCheckbox: 'vn-ticket-sale vn-tr:nth-child(3) vn-check[ng-model="sale.checked"]',
+ fourthSaleCheckbox: 'vn-ticket-sale vn-tr:nth-child(4) vn-check[ng-model="sale.checked"]',
deleteSaleButton: 'vn-ticket-sale vn-tool-bar > vn-button[icon="delete"]',
transferSaleButton: 'vn-ticket-sale vn-tool-bar > vn-button[icon="call_split"]',
moveToTicketInput: 'form vn-input-number[ng-model="$ctrl.transfer.ticketId"] input',
diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
index 2158eec8b..2c9646708 100644
--- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
+++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
@@ -251,7 +251,6 @@ describe('Ticket Edit sale path', () => {
await page.waitToClick(selectors.ticketSales.moreMenu);
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
await page.waitToClick(selectors.globalItems.acceptButton);
- await page.waitToClick(selectors.globalItems.acceptButton);
await page.waitForState('claim.card.basicData');
});
diff --git a/e2e/paths/06-claim/05_summary.spec.js b/e2e/paths/06-claim/05_summary.spec.js
index 758dc2ee3..9656ea656 100644
--- a/e2e/paths/06-claim/05_summary.spec.js
+++ b/e2e/paths/06-claim/05_summary.spec.js
@@ -17,7 +17,7 @@ describe('Claim summary path', () => {
});
it('should navigate to the target claim summary section', async() => {
- await page.loginAndModule('employee', 'claim');
+ await page.loginAndModule('salesPerson', 'claim');
await page.accessToSearchResult(claimId);
await page.waitForState('claim.card.summary');
});
diff --git a/e2e/paths/06-claim/06_descriptor.spec.js b/e2e/paths/06-claim/06_descriptor.spec.js
index 0826bad63..059bd68dd 100644
--- a/e2e/paths/06-claim/06_descriptor.spec.js
+++ b/e2e/paths/06-claim/06_descriptor.spec.js
@@ -16,7 +16,7 @@ describe('Claim descriptor path', () => {
});
it('should now navigate to the target claim summary section', async() => {
- await page.loginAndModule('employee', 'claim');
+ await page.loginAndModule('salesPerson', 'claim');
await page.accessToSearchResult(claimId);
await page.waitForState('claim.card.summary');
});
diff --git a/front/salix/components/descriptor/style.scss b/front/salix/components/descriptor/style.scss
index 27f482f26..b96e900c4 100644
--- a/front/salix/components/descriptor/style.scss
+++ b/front/salix/components/descriptor/style.scss
@@ -7,22 +7,24 @@ vn-descriptor-content {
.photo {
position: relative;
+ width: 100%;
+ text-align: center;
+ overflow: hidden;
& > img[ng-src] {
min-height: 16em;
display: block;
- max-width: 100%;
height: 256px;
}
vn-float-button {
- position: absolute;
- margin: 1em;
- bottom: 0;
+ position: absolute;
+ margin: 1em;
+ bottom: 0;
right: 0
}
}
-
+
& > vn-spinner {
display: block;
height: 40px;
@@ -39,7 +41,7 @@ vn-descriptor-content {
align-items: stretch;
color: $color-font-dark;
- & > a,
+ & > a,
& > vn-icon-button {
display: flex;
min-width: 45px;
@@ -89,7 +91,7 @@ vn-descriptor-content {
display: flex;
align-items: center;
justify-content: center;
-
+
& > vn-icon {
padding: $spacing-xs $spacing-sm;
font-size: 1.5rem;
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index e950b981b..14ffffeb5 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -171,5 +171,7 @@
"Added observation": "Added observation",
"Comment added to client": "Comment added to client",
"This ticket is already a refund": "This ticket is already a refund",
- "A claim with that sale already exists": "A claim with that sale already exists"
+ "A claim with that sale already exists": "A claim with that sale already exists",
+ "Can't transfer claimed sales": "Can't transfer claimed sales",
+ "Invalid quantity": "Invalid quantity"
}
diff --git a/modules/claim/back/methods/claim/createFromSales.js b/modules/claim/back/methods/claim/createFromSales.js
index 10d0b9b28..07bdb30aa 100644
--- a/modules/claim/back/methods/claim/createFromSales.js
+++ b/modules/claim/back/methods/claim/createFromSales.js
@@ -59,12 +59,14 @@ module.exports = Self => {
const landedPlusWeek = new Date(ticket.landed);
landedPlusWeek.setDate(landedPlusWeek.getDate() + 7);
- const hasClaimManagerRole = await models.VnUser.hasRole(userId, 'claimManager', myOptions);
const isClaimable = landedPlusWeek >= Date.vnNew();
+ const canCreateClaimAfterDeadline =
+ await models.ACL.checkAccessAcl(ctx, 'Claim', 'createAfterDeadline', 'WRITE');
+
if (ticket.isDeleted)
throw new UserError(`You can't create a claim for a removed ticket`);
- if (!isClaimable && !hasClaimManagerRole)
+ if (!isClaimable && !canCreateClaimAfterDeadline)
throw new UserError(`You can't create a claim from a ticket delivered more than seven days ago`);
const newClaim = await Self.create({
diff --git a/modules/claim/back/methods/claim/updateClaim.js b/modules/claim/back/methods/claim/updateClaim.js
index f10c68b21..cc7392e39 100644
--- a/modules/claim/back/methods/claim/updateClaim.js
+++ b/modules/claim/back/methods/claim/updateClaim.js
@@ -46,7 +46,6 @@ module.exports = Self => {
Self.updateClaim = async(ctx, id, options) => {
const models = Self.app.models;
- const userId = ctx.req.accessToken.userId;
const args = ctx.args;
let tx;
const myOptions = {};
@@ -81,9 +80,9 @@ module.exports = Self => {
if (args.claimStateFk) {
const canEditOldState = await models.ClaimState.isEditable(ctx, claim.claimStateFk, myOptions);
const canEditNewState = await models.ClaimState.isEditable(ctx, args.claimStateFk, myOptions);
- const isClaimManager = await models.VnUser.hasRole(userId, 'claimManager', myOptions);
+ const canEditState = await models.ACL.checkAccessAcl(ctx, 'Claim', 'editState', 'WRITE');
- if (!canEditOldState || !canEditNewState || changedHasToPickUp && !isClaimManager)
+ if (!canEditOldState || !canEditNewState || changedHasToPickUp && !canEditState)
throw new UserError(`You don't have enough privileges to change that field`);
}
diff --git a/modules/client/back/methods/client/updateAddress.js b/modules/client/back/methods/client/updateAddress.js
index e521870fd..7342b28f1 100644
--- a/modules/client/back/methods/client/updateAddress.js
+++ b/modules/client/back/methods/client/updateAddress.js
@@ -87,15 +87,15 @@ module.exports = function(Self) {
Self.updateAddress = async(ctx, clientId, addressId, options) => {
const models = Self.app.models;
const args = ctx.args;
- const userId = ctx.req.accessToken.userId;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
- const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions);
+ const canEditAddressLogifloraAllowed =
+ await models.ACL.checkAccessAcl(ctx, 'Client', 'editAddressLogifloraAllowed');
- if (args.isLogifloraAllowed && !isSalesAssistant)
+ if (args.isLogifloraAllowed && !canEditAddressLogifloraAllowed)
throw new UserError(`You don't have enough privileges`);
const address = await models.Address.findOne({
diff --git a/modules/client/back/methods/client/updateFiscalData.js b/modules/client/back/methods/client/updateFiscalData.js
index c63dc3991..697c567a3 100644
--- a/modules/client/back/methods/client/updateFiscalData.js
+++ b/modules/client/back/methods/client/updateFiscalData.js
@@ -131,9 +131,10 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', myOptions);
+ const canEditNotTaxDataChecked =
+ await models.ACL.checkAccessAcl(ctx, 'Client', 'editFiscalDataWithoutTaxDataCheck', 'WRITE');
const client = await models.Client.findById(clientId, null, myOptions);
- if (!isSalesAssistant && client.isTaxDataChecked)
+ if (!canEditNotTaxDataChecked && client.isTaxDataChecked)
throw new UserError(`Not enough privileges to edit a client with verified data`);
// Sage data validation
const taxDataChecked = args.isTaxDataChecked;
diff --git a/modules/client/back/methods/client/updateUser.js b/modules/client/back/methods/client/updateUser.js
index 479b4da47..55f1accdd 100644
--- a/modules/client/back/methods/client/updateUser.js
+++ b/modules/client/back/methods/client/updateUser.js
@@ -2,6 +2,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('updateUser', {
description: 'Updates the user information',
+ accessType: 'WRITE',
accepts: [
{
arg: 'id',
@@ -32,7 +33,6 @@ module.exports = Self => {
Self.updateUser = async function(ctx, id, options) {
const models = Self.app.models;
- const userId = ctx.req.accessToken.userId;
let tx;
const myOptions = {};
@@ -45,9 +45,8 @@ module.exports = Self => {
}
try {
- const isSalesPerson = await models.VnUser.hasRole(userId, 'salesPerson', myOptions);
-
- if (!isSalesPerson)
+ const canEdit = await models.ACL.checkAccessAcl(ctx, 'Client', 'updateUser', 'WRITE');
+ if (!canEdit)
throw new UserError(`Not enough privileges to edit a client`);
const isClient = await models.Client.findById(id, null, myOptions);
diff --git a/modules/client/back/models/client.js b/modules/client/back/models/client.js
index 56adc8b03..7b577fa98 100644
--- a/modules/client/back/models/client.js
+++ b/modules/client/back/models/client.js
@@ -218,9 +218,9 @@ module.exports = Self => {
const models = Self.app.models;
const loopBackContext = LoopBackContext.getCurrentContext();
- const userId = loopBackContext.active.accessToken.userId;
+ const accessToken = {req: loopBackContext.active.accessToken};
- const isSalesAssistant = await models.VnUser.hasRole(userId, 'salesAssistant', ctx.options);
+ const editVerifiedDataWithoutTaxDataChecked = models.ACL.checkAccessAcl(accessToken, 'Client', 'editVerifiedDataWithoutTaxDataCheck', 'WRITE');
const hasChanges = orgData && changes;
const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked);
@@ -232,8 +232,8 @@ module.exports = Self => {
const sageTransactionType = hasChanges && (changes.sageTransactionTypeFk || orgData.sageTransactionTypeFk);
const sageTransactionTypeChanged = hasChanges && orgData.sageTransactionTypeFk != sageTransactionType;
- const cantEditVerifiedData = isTaxDataCheckedChanged && !isSalesAssistant;
- const cantChangeSageData = (sageTaxTypeChanged || sageTransactionTypeChanged) && !isSalesAssistant;
+ const cantEditVerifiedData = isTaxDataCheckedChanged && !editVerifiedDataWithoutTaxDataChecked;
+ const cantChangeSageData = (sageTaxTypeChanged || sageTransactionTypeChanged) && !editVerifiedDataWithoutTaxDataChecked;
if (cantEditVerifiedData || cantChangeSageData)
throw new UserError(`You don't have enough privileges`);
@@ -401,9 +401,10 @@ module.exports = Self => {
Self.changeCredit = async function changeCredit(ctx, finalState, changes) {
const models = Self.app.models;
const userId = ctx.options.accessToken.userId;
+ const accessToken = {req: {accessToken: ctx.options.accessToken} };
- const isFinancialBoss = await models.VnUser.hasRole(userId, 'financialBoss', ctx.options);
- if (!isFinancialBoss) {
+ const canEditCredit = await models.ACL.checkAccessAcl(accessToken, 'Client', 'editCredit', 'WRITE');
+ if (!canEditCredit) {
const lastCredit = await models.ClientCredit.findOne({
where: {
clientFk: finalState.id
@@ -412,10 +413,9 @@ module.exports = Self => {
}, ctx.options);
const lastAmount = lastCredit && lastCredit.amount;
- const lastWorkerId = lastCredit && lastCredit.workerFk;
- const lastWorkerIsFinancialBoss = await models.VnUser.hasRole(lastWorkerId, 'financialBoss', ctx.options);
+ const lastCreditIsNotEditable = !await models.ACL.checkAccessAcl(accessToken, 'Client', 'isNotEditableCredit', 'WRITE');
- if (lastAmount == 0 && lastWorkerIsFinancialBoss)
+ if (lastAmount == 0 && lastCreditIsNotEditable)
throw new UserError(`You can't change the credit set to zero from a financialBoss`);
const creditLimits = await models.ClientCreditLimit.find({
diff --git a/modules/client/front/dms/edit/index.html b/modules/client/front/dms/edit/index.html
index 87d69fdcd..58899df2b 100644
--- a/modules/client/front/dms/edit/index.html
+++ b/modules/client/front/dms/edit/index.html
@@ -2,6 +2,11 @@
vn-id="watcher"
data="$ctrl.dms">
+