Compare commits

...

99 Commits

Author SHA1 Message Date
Javier Segarra db06620d7c Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5858-zone_Collisions
gitea/salix/pipeline/head There was a failure building this commit Details
2023-12-01 09:39:47 +01:00
Javier Segarra 60fbb1d56e refs #5858 feat: update procedure zoneIncluded_getCollisions 2023-12-01 09:39:21 +01:00
Jorge Penadés 0b1bbbaaa6 Merge pull request 'refs #5835 rate added' (!1865) from 5835-summaryRate into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1865
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-12-01 07:22:26 +00:00
Jorge Penadés 611b45bae0 Merge branch 'dev' into 5835-summaryRate
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 15:16:18 +00:00
Alex Moreno ee7dd66ce9 Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix into dev
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 12:49:42 +01:00
Alex Moreno 35e74a7635 Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix into test
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 12:48:27 +01:00
Alex Moreno ab69dcd4fe refs #6524 fix: fixtures and feat: new changelog format
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 12:32:41 +01:00
Javier Segarra b241efc961 Merge pull request 'refs #6434 feat: improve signIn method' (!1867) from 6434-signInLog_improve_test into test
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1867
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-30 11:20:57 +00:00
Alex Moreno 016e4ae37c Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix 2023-11-30 12:20:50 +01:00
Carlos Satorres e7d3ef0763 Merge pull request 'refs #6065 remove workcenter' (!1871) from hotfix-hoursFetch into master
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1871
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-30 09:20:26 +00:00
Jorge Penadés 6121eeaa3a Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5835-summaryRate
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 09:44:05 +01:00
Carlos Satorres 9cdb7c3cca refs #6065 remove workcenter
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 09:18:00 +01:00
Javi Gallego 69e555e7b4 Merge pull request '5652-fixtures-fix' (!1870) from 5652-fixtures-fix into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1870
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-30 08:13:05 +00:00
Javier Segarra 7611acb8f2 refs #6434 perf rename version folder for sql file
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 08:34:10 +01:00
Javier Segarra 80f8037f58 refs #6434 perf remove version folder for sql file
gitea/salix/pipeline/head This commit looks good Details
2023-11-30 08:23:14 +01:00
Javier Segarra 58855a7cdd refs #6434 perf: remove bad characters method description
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-30 08:14:56 +01:00
Javier Segarra 6b354a20ad refs #6434 perf: add sql table description
gitea/salix/pipeline/head Build queued... Details
2023-11-30 08:13:28 +01:00
Javier Segarra 138d11b7b0 refs #6434 perf new version folder for sql file
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-30 08:10:32 +01:00
Javier Segarra 1576ab992d refs #6434 perf: new field in SignInLog table
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 19:36:30 +00:00
Javier Segarra 46774b2e73 refs #6434 perf: new field in SignInLog table
gitea/salix/pipeline/head Build queued... Details
2023-11-29 19:35:37 +00:00
Javier Segarra 9176cdb4cb refs #6434 perf: new field in SignInLog table
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 19:34:00 +00:00
Javier Segarra ed6c0924d7 refs #6434 perf: remove console.error
gitea/salix/pipeline/head Build queued... Details
2023-11-29 19:33:04 +00:00
Javier Segarra 48b82b02ca refs #6434 change param type for signInValidate
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 19:32:10 +00:00
Javi Gallego d246b5f9a8 Merge branch 'dev' into 5652-fixtures-fix
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 15:26:51 +01:00
Guillermo Bonet b3cc020ea7 Merge pull request 'refs #6023 Fix change rol bug' (!1727) from 6023-changeRol into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1727
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-29 11:48:17 +00:00
Javier Segarra c40dc134f8 refs #5858 feat: sql files for new version 2023-11-29 12:15:38 +01:00
Guillermo Bonet 5e9a62eac2 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 08:21:23 +00:00
Alex Moreno 2e22984e77 refs #6197 fix: add salix role in fixtures
gitea/salix/pipeline/head This commit looks good Details
2023-11-29 09:13:54 +01:00
Javier Segarra 63533459b0 refs #6434 feat: improve signIn method
gitea/salix/pipeline/head This commit looks good Details
2023-11-28 13:22:17 +01:00
Jorge Penadés f2673c3818 refs #5835 rate added
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-28 12:12:42 +01:00
Guillermo Bonet 1a5cc67312 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-11-28 12:07:50 +01:00
Javi Gallego 2fa56cce4b fix: refs #5652 arreglo fixtures
gitea/salix/pipeline/head This commit looks good Details
2023-11-28 09:22:00 +01:00
Alex Moreno 37555cbb63 refs #6335 warmFix(ticketAdvance): correct properties
gitea/salix/pipeline/head This commit looks good Details
2023-11-27 15:10:00 +01:00
Juan Ferrer c7291e3367 Merge pull request 'test' (!1863) from test into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1863
2023-11-27 12:17:11 +00:00
Juan Ferrer 74772472d5 Merge pull request 'master' (!1820) from master into test
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1820
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-27 12:16:42 +00:00
Carlos Satorres 23235e2b44 Merge pull request 'refs #6506 contract' (!1861) from 6506-hotfixContract into master
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1861
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-27 12:07:52 +00:00
Guillermo Bonet 8ee8d90eec Merge pull request 'refactor: refs #3222 Expence to expense' (!1860) from 3222-expenceToExpense into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1860
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-27 09:56:30 +00:00
Guillermo Bonet 3bdb002034 Merge branch 'dev' into 3222-expenceToExpense
gitea/salix/pipeline/head This commit looks good Details
2023-11-27 09:06:17 +00:00
Guillermo Bonet aefff68c29 refactor: refs #3222 Requested changes
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-27 09:51:56 +01:00
Alex Moreno 3fb1ed9dfe Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix into 6506-hotfixContract
gitea/salix/pipeline/head This commit looks good Details
2023-11-27 08:38:17 +01:00
Jorge Penadés d075cb97ad Merge pull request 'refs #5811 feat: al borrar expedicion borrar de viaexpress' (!1754) from 5811-ticket.expedition_deleteViaexpress into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1754
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-27 07:36:28 +00:00
Carlos Satorres f9d5cad412 refs #6506 contract
gitea/salix/pipeline/head This commit looks good Details
2023-11-27 07:57:18 +01:00
Guillermo Bonet 2be1639e9f refactor: refs #3222 Expence to expense
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 12:42:25 +01:00
Jorge Penadés 53c8e87b5b Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 10:57:32 +01:00
Jorge Penadés 74dd64126a Merge pull request '#5835 getTotals fixed' (!1854) from 5835-fixGetTotals into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1854
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2023-11-24 09:56:21 +00:00
Jorge Penadés 8ac3887d80 refs #5811 rename methods
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-24 10:53:38 +01:00
Jorge Penadés c56588a472 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 10:18:47 +01:00
Jorge Penadés b3584d9db5 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5835-fixGetTotals
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 10:12:45 +01:00
Carlos Satorres 461cb3d2ba Merge pull request 'hotfix-undefinedContract' (!1859) from hotfix-undefinedContract into master
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1859
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-24 08:06:41 +00:00
Carlos Satorres 5d18c211a0 refs #6507 state
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 08:40:06 +01:00
Carlos Satorres 8a568f180a refs #6506 fix e2e, refactor business
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 07:47:57 +01:00
Carlos Satorres ebe467f721 refs #6506 hotfix
gitea/salix/pipeline/head This commit looks good Details
2023-11-24 07:04:55 +01:00
Javi Gallego 4a62588464 Merge pull request '6028_route_getRouteByWorker' (!1857) from 6028_route_getRouteByWorker into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #1857
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-23 14:01:53 +00:00
Jorge Penadés 1f9030c36d Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 13:35:46 +01:00
Jorge Penadés eeef279483 refs #5811 replace decription
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 13:34:29 +01:00
Jorge Penadés 5f09907c98 Merge branch '5835-fixGetTotals' of https://gitea.verdnatura.es/verdnatura/salix into 5835-fixGetTotals
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 13:21:09 +01:00
Jorge Penadés 025e4f3f87 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5835-fixGetTotals 2023-11-23 13:21:00 +01:00
Jorge Penadés f4a1d09ef8 Merge branch 'dev' into 5835-fixGetTotals
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 12:04:05 +00:00
Sergio De la torre 756e55f5c2 Merge pull request 'refs #5890 fix: getTickets' (!1852) from 5890_collection_getTickets into dev
gitea/salix/pipeline/head Build queued... Details
Reviewed-on: #1852
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2023-11-23 11:23:15 +00:00
Alex Moreno 4735307f5d refs #5890: fix(Collection/getTickets): accepts iss.quantity nulls
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 11:49:00 +01:00
Jorge Penadés 6b2c1e09de refs #5835 refactor
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 11:31:00 +01:00
Javi Gallego 5b145a57e6 error: refs 6028 test front quitado
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 11:29:53 +01:00
Jorge Penadés 048e3089cd Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5835-fixGetTotals
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 11:26:41 +01:00
Jorge Penadés db15285858 refs #5811 test updated
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 11:21:56 +01:00
Jorge Penadés 2e67ef4f5d refs #5811 refactor deleteExpeditions
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 10:32:07 +01:00
Jorge Penadés 900dffbbba refs #5811 delete viaexpress expeditions included
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 10:26:28 +01:00
Javi Gallego f44424dbcf test: refs #6028 test
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 09:44:47 +01:00
Javi Gallego 5b289ec083 Merge branch 'dev' into 6028_route_getRouteByWorker 2023-11-23 09:21:44 +01:00
Alex Moreno 1277bec801 Merge branch 'dev' into 5890_collection_getTickets
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 07:56:02 +00:00
Jorge Penadés 6580896dcd Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 08:46:11 +01:00
Alex Moreno 217aa1ac77 refs #6491 deploy(2350) init version
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 08:35:08 +01:00
Jorge Penadés da7b670d74 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-11-23 08:28:56 +01:00
Alex Moreno f4fabb9fff refs #6491 refactor(order_filter): optimized
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-23 08:26:14 +01:00
Carlos Andrés 800d12e0f2 Merge branch 'dev' into 5890_collection_getTickets
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-22 18:00:34 +00:00
Carlos Satorres 2b455488a3 Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix
gitea/salix/pipeline/head This commit looks good Details
2023-11-22 18:35:16 +01:00
Carlos Satorres 6b07ee4eb1 hotfix workerhours 2023-11-22 18:35:14 +01:00
Javi Gallego e856de0cfd feat: refs #6028 test
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-22 15:54:38 +01:00
Jorge Penadés 26a8cc6a2c Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-22 15:41:24 +01:00
Javi Gallego e146c0ea46 Merge branch 'dev' into 6028_route_getRouteByWorker
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-22 12:42:20 +01:00
Jorge Penadés a27bb53089 refs #5835 getTotals fixed
gitea/salix/pipeline/head This commit looks good Details
2023-11-22 08:57:45 +01:00
Sergio De la torre 707173d618 refs #5890 fix: getTickets
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-22 07:04:33 +01:00
Jorge Penadés 3f8d1ff617 Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-11-21 10:17:31 +01:00
Juan Ferrer bf7c67dbde fix: refs #6197 add definer to events
gitea/salix/pipeline/head This commit looks good Details
2023-11-21 09:26:02 +01:00
Juan Ferrer 0a2fd9cf5d fix: refs #6432, #5848 account sync fixes
gitea/salix/pipeline/head This commit looks good Details
2023-11-20 18:39:37 +01:00
Guillermo Bonet 2847b993d3 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-11-15 11:30:23 +00:00
Guillermo Bonet a4cbc33ee1 Merge branch '6023-changeRol' of https://gitea.verdnatura.es/verdnatura/salix into 6023-changeRol
gitea/salix/pipeline/head There was a failure building this commit Details
2023-11-10 11:55:38 +01:00
Guillermo Bonet b7da144967 feat: refs #6023 Added SELECT FOR UPDATE 2023-11-10 11:55:37 +01:00
Guillermo Bonet eb98de71b1 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-11-10 10:49:38 +00:00
Guillermo Bonet 9f92bc4b4c fix: refs #6023 Rollback privileges.js
gitea/salix/pipeline/head This commit looks good Details
2023-11-10 11:43:42 +01:00
Guillermo Bonet 9668468f94 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-11-09 13:06:55 +00:00
Alex Moreno 30895f444f Merge branch 'dev' into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-10-26 12:14:31 +00:00
Alex Moreno 2dbd711104 Merge branch 'dev' into 5811-ticket.expedition_deleteViaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-09-19 05:24:05 +00:00
Guillermo Bonet f6d46396b5 Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-09-18 08:15:43 +00:00
Guillermo Bonet cab3548c9b Merge branch 'dev' into 6023-changeRol
gitea/salix/pipeline/head This commit looks good Details
2023-09-01 06:11:08 +00:00
Guillermo Bonet 0dbb77fc64 refs #6023 Transactioned sync
gitea/salix/pipeline/head This commit looks good Details
2023-08-31 09:20:33 +02:00
Guillermo Bonet 9f6d034f9c refs #6023 Minor changes
gitea/salix/pipeline/head This commit looks good Details
2023-08-29 13:45:20 +02:00
Guillermo Bonet d1df8009a6 refs #6023 Fix change rol bug
gitea/salix/pipeline/head There was a failure building this commit Details
2023-08-29 10:52:05 +02:00
Vicent Llopis f3e43686a3 refs #5811 feat: al borrar expedicion borrar tmb de viaexpress
gitea/salix/pipeline/head This commit looks good Details
2023-08-24 14:59:28 +02:00
Sergio De la torre 639d5963a3 refs #6028 get_routes
gitea/salix/pipeline/head There was a failure building this commit Details
2023-07-17 13:50:07 +02:00
108 changed files with 758 additions and 556 deletions

View File

@ -5,15 +5,22 @@ 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/), 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). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2348.01] - 2023-11-30 ## [2350.01] - 2023-12-14
### Added ### Added
- (Ticket -> Adelantar) Permite mover lineas sin generar negativos
- (Ticket -> Adelantar) Permite modificar la fecha de los tickets
### Changed ### Changed
### Fixed ### Fixed
- (Ticket -> RocketChat) Arreglada detección de cambios
## [2348.01] - 2023-11-30
### Características Añadidas 🆕
- **Tickets → Adelantar:** Permite mover lineas sin generar negativos
- **Tickets → Adelantar:** Permite modificar la fecha de los tickets
- **Trabajadores → Notificaciones:** Nueva sección (lilium)
### Correcciones 🛠️
- **Tickets → RocketChat:** Arreglada detección de cambios
## [2346.01] - 2023-11-16 ## [2346.01] - 2023-11-16

View File

@ -75,7 +75,7 @@ module.exports = Self => {
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
LEFT JOIN origin o ON o.id = i.originFk LEFT JOIN origin o ON o.id = i.originFk
WHERE tc.collectionFk = ? WHERE tc.collectionFk = ?
GROUP BY ish.id, p.code, p2.code GROUP BY s.id, ish.id, p.code, p2.code
ORDER BY pickingOrder;`, [id], myOptions); ORDER BY pickingOrder;`, [id], myOptions);
if (print) if (print)

View File

@ -1,133 +0,0 @@
module.exports = Self => {
Self.remoteMethodCtx('newCollection', {
description: 'Make a new collection of tickets',
accessType: 'WRITE',
accepts: [{
arg: 'collectionFk',
type: 'Number',
required: false,
description: 'The collection id'
}, {
arg: 'sectorFk',
type: 'Number',
required: true,
description: 'The sector of worker'
}, {
arg: 'vWagons',
type: 'Number',
required: true,
description: 'The number of wagons'
}],
returns: {
type: 'Object',
root: true
},
http: {
path: `/newCollection`,
verb: 'POST'
}
});
Self.newCollection = async(ctx, collectionFk, sectorFk, vWagons) => {
let query = '';
const userId = ctx.req.accessToken.userId;
if (!collectionFk) {
query = `CALL vn.collectionTrain_newBeta(?,?,?)`;
const [result] = await Self.rawSql(query, [sectorFk, vWagons, userId], {userId});
if (result.length == 0)
throw new Error(`No collections for today`);
collectionFk = result[0].vCollectionFk;
}
query = `CALL vn.collectionTicket_get(?)`;
const [tickets] = await Self.rawSql(query, [collectionFk], {userId});
query = `CALL vn.collectionSale_get(?)`;
const [sales] = await Self.rawSql(query, [collectionFk], {userId});
query = `CALL vn.collectionPlacement_get(?)`;
const [placements] = await Self.rawSql(query, [collectionFk], {userId});
query = `CALL vn.collectionSticker_print(?,?)`;
await Self.rawSql(query, [collectionFk, sectorFk], {userId});
return makeCollection(tickets, sales, placements, collectionFk);
};
/**
* Returns a collection json
* @param {*} tickets - Request tickets
* @param {*} sales - Request sales
* @param {*} placements - Request placements
* @param {*} collectionFk - Request placements
* @return {Object} Collection JSON
*/
async function makeCollection(tickets, sales, placements, collectionFk) {
let collection = [];
for (let i = 0; i < tickets.length; i++) {
let ticket = {};
ticket['ticketFk'] = tickets[i]['ticketFk'];
ticket['level'] = tickets[i]['level'];
ticket['agencyName'] = tickets[i]['agencyName'];
ticket['warehouseFk'] = tickets[i]['warehouseFk'];
ticket['salesPersonFk'] = tickets[i]['salesPersonFk'];
let ticketSales = [];
for (let x = 0; x < sales.length; x++) {
if (sales[x]['ticketFk'] == ticket['ticketFk']) {
let sale = {};
sale['collectionFk'] = collectionFk;
sale['ticketFk'] = sales[x]['ticketFk'];
sale['saleFk'] = sales[x]['saleFk'];
sale['itemFk'] = sales[x]['itemFk'];
sale['quantity'] = sales[x]['quantity'];
if (sales[x]['quantityPicked'] != null)
sale['quantityPicked'] = sales[x]['quantityPicked'];
else
sale['quantityPicked'] = 0;
sale['longName'] = sales[x]['longName'];
sale['size'] = sales[x]['size'];
sale['color'] = sales[x]['color'];
sale['discount'] = sales[x]['discount'];
sale['price'] = sales[x]['price'];
sale['stems'] = sales[x]['stems'];
sale['category'] = sales[x]['category'];
sale['origin'] = sales[x]['origin'];
sale['clientFk'] = sales[x]['clientFk'];
sale['productor'] = sales[x]['productor'];
sale['reserved'] = sales[x]['reserved'];
sale['isPreviousPrepared'] = sales[x]['isPreviousPrepared'];
sale['isPrepared'] = sales[x]['isPrepared'];
sale['isControlled'] = sales[x]['isControlled'];
let salePlacements = [];
for (let z = 0; z < placements.length; z++) {
if (placements[z]['saleFk'] == sale['saleFk']) {
let placement = {};
placement['saleFk'] = placements[z]['saleFk'];
placement['itemFk'] = placements[z]['itemFk'];
placement['placement'] = placements[z]['placement'];
placement['shelving'] = placements[z]['shelving'];
placement['created'] = placements[z]['created'];
placement['visible'] = placements[z]['visible'];
placement['order'] = placements[z]['order'];
placement['grouping'] = placements[z]['grouping'];
salePlacements.push(placement);
}
}
sale['placements'] = salePlacements;
ticketSales.push(sale);
}
}
ticket['sales'] = ticketSales;
collection.push(ticket);
}
return collection;
}
};

View File

@ -1,12 +0,0 @@
const {models} = require('vn-loopback/server/server');
describe('newCollection()', () => {
it('should return a new collection', async() => {
pending('#3400 analizar que hacer con rutas de back collection');
let ctx = {req: {accessToken: {userId: 1106}}};
let response = await models.Collection.newCollection(ctx, 1, 1, 1);
expect(response.length).toBeGreaterThan(0);
expect(response[0].ticketFk).toEqual(2);
});
});

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<DeleteEnvio xmlns="http://82.223.6.71:82">
<IdCliente><%= viaexpressConfig.client %></IdCliente>
<Usuario><%= viaexpressConfig.user %></Usuario>
<Password><%= viaexpressConfig.password %></Password>
<etiqueta><%= externalId %></etiqueta>
</DeleteEnvio>
</soap12:Body>
</soap12:Envelope>

View File

@ -0,0 +1,45 @@
const axios = require('axios');
const {DOMParser} = require('xmldom');
module.exports = Self => {
Self.remoteMethod('deleteExpedition', {
description: 'Delete a shipment by providing the expedition ID, interacting with Viaexpress API',
accessType: 'WRITE',
accepts: [{
arg: 'expeditionFk',
type: 'number',
required: true
}],
returns: {
type: ['object'],
root: true
},
http: {
path: `/deleteExpedition`,
verb: 'POST'
}
});
Self.deleteExpedition = async expeditionFk => {
const models = Self.app.models;
const viaexpressConfig = await models.ViaexpressConfig.findOne({
fields: ['url']
});
const renderedXml = await models.ViaexpressConfig.deleteExpeditionRenderer(expeditionFk);
const response = await axios.post(`${viaexpressConfig.url}ServicioVxClientes.asmx`, renderedXml, {
headers: {
'Content-Type': 'application/soap+xml; charset=utf-8'
}
});
const xmlString = response.data;
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
const resultElement = xmlDoc.getElementsByTagName('DeleteEnvioResult')[0];
const result = resultElement.textContent;
return result;
};
};

View File

@ -0,0 +1,44 @@
const fs = require('fs');
const ejs = require('ejs');
module.exports = Self => {
Self.remoteMethod('deleteExpeditionRenderer', {
description: 'Renders the data from an XML',
accessType: 'READ',
accepts: [{
arg: 'expeditionFk',
type: 'number',
required: true
}],
returns: {
type: ['object'],
root: true
},
http: {
path: `/deleteExpeditionRenderer`,
verb: 'GET'
}
});
Self.deleteExpeditionRenderer = async expeditionFk => {
const models = Self.app.models;
const viaexpressConfig = await models.ViaexpressConfig.findOne({
fields: ['client', 'user', 'password']
});
const expedition = await models.Expedition.findOne({
fields: ['id', 'externalId'],
where: {id: expeditionFk}
});
const data = {
viaexpressConfig,
externalId: expedition.externalId
};
const template = fs.readFileSync(__dirname + '/deleteExpedition.ejs', 'utf-8');
const renderedXml = ejs.render(template, data);
return renderedXml;
};
};

View File

@ -49,13 +49,7 @@ module.exports = Self => {
if (vnUser.twoFactor) if (vnUser.twoFactor)
throw new ForbiddenError(null, 'REQUIRES_2FA'); throw new ForbiddenError(null, 'REQUIRES_2FA');
} }
const validateLogin = await Self.validateLogin(user, password); return Self.validateLogin(user, password, ctx);
await Self.app.models.SignInLog.create({
token: validateLogin.token,
userFk: vnUser.id,
ip: ctx.req.ip
});
return validateLogin;
}; };
Self.passExpired = async vnUser => { Self.passExpired = async vnUser => {

View File

@ -2,7 +2,7 @@ const {models} = require('vn-loopback/server/server');
describe('VnUser Sign-in()', () => { describe('VnUser Sign-in()', () => {
const employeeId = 1; const employeeId = 1;
const unauthCtx = { const unAuthCtx = {
req: { req: {
headers: {}, headers: {},
connection: { connection: {
@ -15,20 +15,21 @@ describe('VnUser Sign-in()', () => {
const {VnUser, AccessToken, SignInLog} = models; const {VnUser, AccessToken, SignInLog} = models;
describe('when credentials are correct', () => { describe('when credentials are correct', () => {
it('should return the token if user uses email', async() => { it('should return the token if user uses email', async() => {
let login = await VnUser.signIn(unauthCtx, 'salesAssistant@mydomain.com', 'nightmare'); let login = await VnUser.signIn(unAuthCtx, 'salesAssistant@mydomain.com', 'nightmare');
let accessToken = await AccessToken.findById(login.token); let accessToken = await AccessToken.findById(login.token);
let ctx = {req: {accessToken: accessToken}}; let ctx = {req: {accessToken: accessToken}};
let signInLog = await SignInLog.find({where: {token: accessToken.id}}); let signInLog = await SignInLog.find({where: {token: accessToken.id}});
expect(signInLog.length).toEqual(1); expect(signInLog.length).toEqual(1);
expect(signInLog[0].userFk).toEqual(accessToken.userId); expect(signInLog[0].userFk).toEqual(accessToken.userId);
expect(signInLog[0].owner).toEqual(true);
expect(login.token).toBeDefined(); expect(login.token).toBeDefined();
await VnUser.logout(ctx.req.accessToken.id); await VnUser.logout(ctx.req.accessToken.id);
}); });
it('should return the token', async() => { it('should return the token', async() => {
let login = await VnUser.signIn(unauthCtx, 'salesAssistant', 'nightmare'); let login = await VnUser.signIn(unAuthCtx, 'salesAssistant', 'nightmare');
let accessToken = await AccessToken.findById(login.token); let accessToken = await AccessToken.findById(login.token);
let ctx = {req: {accessToken: accessToken}}; let ctx = {req: {accessToken: accessToken}};
@ -38,7 +39,7 @@ describe('VnUser Sign-in()', () => {
}); });
it('should return the token if the user doesnt exist but the client does', async() => { it('should return the token if the user doesnt exist but the client does', async() => {
let login = await VnUser.signIn(unauthCtx, 'PetterParker', 'nightmare'); let login = await VnUser.signIn(unAuthCtx, 'PetterParker', 'nightmare');
let accessToken = await AccessToken.findById(login.token); let accessToken = await AccessToken.findById(login.token);
let ctx = {req: {accessToken: accessToken}}; let ctx = {req: {accessToken: accessToken}};
@ -53,7 +54,7 @@ describe('VnUser Sign-in()', () => {
let error; let error;
try { try {
await VnUser.signIn(unauthCtx, 'IDontExist', 'TotallyWrongPassword'); await VnUser.signIn(unAuthCtx, 'IDontExist', 'TotallyWrongPassword');
} catch (e) { } catch (e) {
error = e; error = e;
} }
@ -74,7 +75,7 @@ describe('VnUser Sign-in()', () => {
const options = {transaction: tx}; const options = {transaction: tx};
await employee.updateAttribute('twoFactor', 'email', options); await employee.updateAttribute('twoFactor', 'email', options);
await VnUser.signIn(unauthCtx, 'employee', 'nightmare', options); await VnUser.signIn(unAuthCtx, 'employee', 'nightmare', options);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
await tx.rollback(); await tx.rollback();
@ -99,7 +100,7 @@ describe('VnUser Sign-in()', () => {
const options = {transaction: tx}; const options = {transaction: tx};
await employee.updateAttribute('passExpired', yesterday, options); await employee.updateAttribute('passExpired', yesterday, options);
await VnUser.signIn(unauthCtx, 'employee', 'nightmare', options); await VnUser.signIn(unAuthCtx, 'employee', 'nightmare', options);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
await tx.rollback(); await tx.rollback();

View File

@ -1,6 +1,5 @@
module.exports = Self => { module.exports = Self => {
require('../methods/collection/getCollection')(Self); require('../methods/collection/getCollection')(Self);
require('../methods/collection/newCollection')(Self);
require('../methods/collection/getSectors')(Self); require('../methods/collection/getSectors')(Self);
require('../methods/collection/setSaleQuantity')(Self); require('../methods/collection/setSaleQuantity')(Self);
require('../methods/collection/previousLabel')(Self); require('../methods/collection/previousLabel')(Self);

View File

@ -1,4 +1,6 @@
module.exports = Self => { module.exports = Self => {
require('../methods/viaexpress-config/internationalExpedition')(Self); require('../methods/viaexpress-config/internationalExpedition')(Self);
require('../methods/viaexpress-config/renderer')(Self); require('../methods/viaexpress-config/renderer')(Self);
require('../methods/viaexpress-config/deleteExpedition')(Self);
require('../methods/viaexpress-config/deleteExpeditionRenderer')(Self);
}; };

View File

@ -124,20 +124,42 @@ module.exports = function(Self) {
return email.send(); return email.send();
}); });
Self.signInValidate = (user, userToken) => {
/**
* Sign-in validate
* @param {String} user The user
* @param {Object} userToken Options
* @param {Object} token accessToken
* @param {Object} ctx context
*/
Self.signInValidate = async(user, userToken, token, ctx) => {
const [[key, value]] = Object.entries(Self.userUses(user)); const [[key, value]] = Object.entries(Self.userUses(user));
if (userToken[key].toLowerCase().trim() !== value.toLowerCase().trim()) { const isOwner = Self.rawSql(`SELECT ? = ? `, [userToken[key], value]);
console.error('ERROR!!! - Signin with other user', userToken, user); await Self.app.models.SignInLog.create({
userName: user,
token: token.id,
userFk: userToken.id,
ip: ctx.req.ip,
owner: isOwner
});
if (!isOwner)
throw new UserError('Try again'); throw new UserError('Try again');
}
}; };
Self.validateLogin = async function(user, password) { /**
* Validate login params
* @param {String} user The user
* @param {String} password
* @param {Object} ctx context
*/
Self.validateLogin = async function(user, password, ctx) {
const loginInfo = Object.assign({password}, Self.userUses(user)); const loginInfo = Object.assign({password}, Self.userUses(user));
const token = await Self.login(loginInfo, 'user'); const token = await Self.login(loginInfo, 'user');
const userToken = await token.user.get(); const userToken = await token.user.get();
Self.signInValidate(user, userToken);
if (ctx)
await Self.signInValidate(user, userToken, token, ctx);
try { try {
await Self.app.models.Account.sync(userToken.name, password); await Self.app.models.Account.sync(userToken.name, password);
@ -226,10 +248,12 @@ module.exports = function(Self) {
const env = process.env.NODE_ENV; const env = process.env.NODE_ENV;
const liliumUrl = await Self.app.models.Url.findOne({ const liliumUrl = await Self.app.models.Url.findOne({
where: {and: [ where: {
and: [
{appName: 'lilium'}, {appName: 'lilium'},
{environment: env} {environment: env}
]} ]
}
}); });
class Mailer { class Mailer {

View File

@ -118,13 +118,13 @@ BEGIN
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
FROM tmp.ticketToInvoice ti; FROM tmp.ticketToInvoice ti;
CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceExpenseMake(vNewInvoiceId);
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
UPDATE invoiceOut io UPDATE invoiceOut io
JOIN ( JOIN (
SELECT SUM(amount) AS total SELECT SUM(amount) AS total
FROM invoiceOutExpence FROM invoiceOutExpense
WHERE invoiceOutFk = vNewInvoiceId WHERE invoiceOutFk = vNewInvoiceId
) base ) base
JOIN ( JOIN (
@ -166,18 +166,18 @@ BEGIN
SET @vTaxableBaseServices := 0.00; SET @vTaxableBaseServices := 0.00;
SET @vTaxCodeGeneral := NULL; SET @vTaxCodeGeneral := NULL;
INSERT INTO vn.invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO vn.invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInId, @vTaxableBaseServices, sub.expenceFk, sub.taxTypeSageFk , sub.transactionTypeSageFk SELECT vNewInvoiceInId, @vTaxableBaseServices, sub.expenseFk, sub.taxTypeSageFk , sub.transactionTypeSageFk
FROM ( FROM (
SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, i.expenceFk, i.taxTypeSageFk , i.transactionTypeSageFk, @vTaxCodeGeneral := i.taxClassCodeFk SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, i.expenseFk, i.taxTypeSageFk , i.transactionTypeSageFk, @vTaxCodeGeneral := i.taxClassCodeFk
FROM tmp.ticketServiceTax tst FROM tmp.ticketServiceTax tst
JOIN vn.invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code JOIN vn.invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code
WHERE i.isService WHERE i.isService
HAVING taxableBase HAVING taxableBase
) sub; ) sub;
INSERT INTO vn.invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO vn.invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInId, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, @vTaxableBaseServices, 0) taxableBase, i.expenceFk, i.taxTypeSageFk , i.transactionTypeSageFk SELECT vNewInvoiceInId, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, @vTaxableBaseServices, 0) taxableBase, i.expenseFk, i.taxTypeSageFk , i.transactionTypeSageFk
FROM tmp.ticketTax tt FROM tmp.ticketTax tt
JOIN vn.invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code JOIN vn.invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code
WHERE !i.isService WHERE !i.isService

View File

@ -139,13 +139,13 @@ BEGIN
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
FROM tmp.ticketToInvoice ti; FROM tmp.ticketToInvoice ti;
CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceExpenseMake(vNewInvoiceId);
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
UPDATE invoiceOut io UPDATE invoiceOut io
JOIN ( JOIN (
SELECT SUM(amount) total SELECT SUM(amount) total
FROM invoiceOutExpence FROM invoiceOutExpense
WHERE invoiceOutFk = vNewInvoiceId WHERE invoiceOutFk = vNewInvoiceId
) base ) base
JOIN ( JOIN (
@ -182,15 +182,15 @@ BEGIN
SET @vTaxableBaseServices := 0.00; SET @vTaxableBaseServices := 0.00;
SET @vTaxCodeGeneral := NULL; SET @vTaxCodeGeneral := NULL;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
@vTaxableBaseServices, @vTaxableBaseServices,
sub.expenceFk, sub.expenseFk,
sub.taxTypeSageFk, sub.taxTypeSageFk,
sub.transactionTypeSageFk sub.transactionTypeSageFk
FROM ( FROM (
SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk, i.taxTypeSageFk,
i.transactionTypeSageFk, i.transactionTypeSageFk,
@vTaxCodeGeneral := i.taxClassCodeFk @vTaxCodeGeneral := i.taxClassCodeFk
@ -200,11 +200,11 @@ BEGIN
HAVING taxableBase HAVING taxableBase
) sub; ) sub;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral,
@vTaxableBaseServices, 0) taxableBase, @vTaxableBaseServices, 0) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk , i.taxTypeSageFk ,
i.transactionTypeSageFk i.transactionTypeSageFk
FROM tmp.ticketTax tt FROM tmp.ticketTax tt

View File

@ -135,13 +135,13 @@ BEGIN
INSERT INTO ticketTracking(stateFk,ticketFk,workerFk) INSERT INTO ticketTracking(stateFk,ticketFk,workerFk)
SELECT * FROM tmp.updateInter; SELECT * FROM tmp.updateInter;
CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceExpenseMake(vNewInvoiceId);
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
UPDATE invoiceOut io UPDATE invoiceOut io
JOIN ( JOIN (
SELECT SUM(amount) total SELECT SUM(amount) total
FROM invoiceOutExpence FROM invoiceOutExpense
WHERE invoiceOutFk = vNewInvoiceId WHERE invoiceOutFk = vNewInvoiceId
) base ) base
JOIN ( JOIN (
@ -178,15 +178,15 @@ BEGIN
SET @vTaxableBaseServices := 0.00; SET @vTaxableBaseServices := 0.00;
SET @vTaxCodeGeneral := NULL; SET @vTaxCodeGeneral := NULL;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
@vTaxableBaseServices, @vTaxableBaseServices,
sub.expenceFk, sub.expenseFk,
sub.taxTypeSageFk, sub.taxTypeSageFk,
sub.transactionTypeSageFk sub.transactionTypeSageFk
FROM ( FROM (
SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk, i.taxTypeSageFk,
i.transactionTypeSageFk, i.transactionTypeSageFk,
@vTaxCodeGeneral := i.taxClassCodeFk @vTaxCodeGeneral := i.taxClassCodeFk
@ -196,11 +196,11 @@ BEGIN
HAVING taxableBase HAVING taxableBase
) sub; ) sub;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral,
@vTaxableBaseServices, 0) taxableBase, @vTaxableBaseServices, 0) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk , i.taxTypeSageFk ,
i.transactionTypeSageFk i.transactionTypeSageFk
FROM tmp.ticketTax tt FROM tmp.ticketTax tt

View File

@ -1,33 +1,60 @@
DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; DROP PROCEDURE IF EXISTS vn.zoneIncluded_checkCollisions;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`(IN zi_zone INT, IN zi_geo INT) DELIMITER $$
$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`()
BEGIN BEGIN
DECLARE done INT DEFAULT 0; DECLARE zic_id, zic_zone, zic_geoFk, zic_action, zic_zoneFk, zic_userFk INT;
DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; DECLARE zic2_geoFk, zic2_zoneFk INT;
DECLARE z_name VARCHAR(255); DECLARE z_name VARCHAR(255);
DECLARE g_name VARCHAR(255); DECLARE g_name VARCHAR(255);
DECLARE vDone boolean;
DECLARE my_cur CURSOR FOR
SELECT zic.id, z.name , zg.name , zic.geoFk ,zic.`action` , zic.userFK FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN my_cur; DECLARE cur CURSOR FOR
my_cur_loop: SELECT zic.id, z.name , zg.name ,zic.zoneFK, zic.geoFk ,zic.`action` , zic.userFK
LOOP FETCH my_cur INTO zic_id, z_name,g_name, zic_geo, zic_action, zic_userFk ; FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg
IF done = 1 THEN WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id and zic.action ='insert';
select concat('NO REDCORDS' ) AS '** DEBUG:';
LEAVE my_cur_loop; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
SET vDone := FALSE;
OPEN cur;
LOOP1: LOOP
SET vDone := FALSE;
FETCH cur INTO zic_id, z_name, g_name, zic_zoneFk, zic_geoFk, zic_action, zic_userFk ;
IF vDone THEN
select concat('NO RECORDS LOOP 1' ) AS '** DEBUG:';
CLOSE cur;
LEAVE LOOP1;
END IF; END IF;
SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_geo,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; -- SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_zoneFk,'**',zic_geoFk,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:';
DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id;
BLOCK2: BEGIN
DECLARE vDone2 boolean;
DECLARE cur2 CURSOR FOR
SELECT zi.zoneFk,zi.geoFk
FROM vn.zoneIncluded zi, vn.zone z
where z.id = zi.zoneFk and zi.zoneFk=zic_zoneFk and zi.geoFk=zic_geoFk and zi.isIncluded = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone2 = TRUE;
SET vDone2 := FALSE;
OPEN cur2;
LOOP2: LOOP
FETCH cur2 INTO zic2_zoneFk, zic2_geoFk ;
IF vDone2 THEN
select concat('NO RECORDS LOOP 2' ) AS '** DEBUG:';
CLOSE cur2;
LEAVE LOOP2;
END IF;
SELECT concat('COLLISION DETECTED', zic2_zoneFk, zic2_geoFk ) AS '** DEBUG:';
SELECT util.notification_send('zone-included', SELECT util.notification_send('zone-included',
JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name),
account.myUser_getId() account.myUser_getId()
); );
END LOOP my_cur_loop; END LOOP LOOP2;
CLOSE my_cur; END BLOCK2;
END LOOP LOOP1;
END
END$$ $$
DELIMITER ; DELIMITER ;

View File

@ -1,11 +1,9 @@
-- Auto-generated SQL script #202311241021
INSERT INTO util.notification (name,description) INSERT INTO util.notification (name,description)
VALUES ('zone-included','An email to notify zoneCollisions'); VALUES ('zone-included','An email to notify zoneCollisions');
-- Auto-generated SQL script #202311241051
INSERT INTO util.notificationSubscription (notificationFk,userFk) INSERT INTO util.notificationSubscription (notificationFk,userFk)
SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included" SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included";
INSERT INTO util.notificationAcl (notificationFk,roleFk) INSERT INTO util.notificationAcl (notificationFk,roleFk)
SELECT id, account.role FROM util.notification WHERE name= "zone-included" SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included";

View File

@ -1,5 +1,4 @@
-- --
-- Table structure for table `signInLog` -- Table structure for table `signInLog`
-- Description: log to debug cross-login error -- Description: log to debug cross-login error
@ -13,7 +12,9 @@ CREATE TABLE `account`.`signInLog` (
`token` varchar(255) NOT NULL , `token` varchar(255) NOT NULL ,
`userFk` int(10) unsigned DEFAULT NULL, `userFk` int(10) unsigned DEFAULT NULL,
`creationDate` timestamp NULL DEFAULT current_timestamp(), `creationDate` timestamp NULL DEFAULT current_timestamp(),
`userName` varchar(30) NOT NULL,
`ip` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `ip` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`owner` tinyint(1) DEFAULT 1,
KEY `userFk` (`userFk`), KEY `userFk` (`userFk`),
CONSTRAINT `signInLog_ibfk_1` FOREIGN KEY (`userFk`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE CONSTRAINT `signInLog_ibfk_1` FOREIGN KEY (`userFk`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
); );

View File

View File

@ -0,0 +1,26 @@
DELETE FROM `salix`.`ACL`
WHERE
model = 'Route'
AND property = '*'
AND accessType = 'READ';
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES
('Route', 'find', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'findById', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'findOne', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getRoutesByWorker', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'canViewAllRoute', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'),
('Route', 'cmr', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'downloadCmrsZip', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'downloadZip', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'filter', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getByWorker', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getDeliveryPoint', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getExternalCmrs', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getSuggestedTickets', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getTickets', 'READ', 'ALLOW', 'ROLE', 'employee'),
('Route', 'guessPriority', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
('Route', 'insertTicket', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getDeliveryPoint', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'),
('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'employee');

View File

@ -1,6 +1,14 @@
CREATE ROLE 'salix';
GRANT 'salix' TO 'root'@'%';
SET DEFAULT ROLE 'salix' FOR 'root'@'%';
CREATE SCHEMA IF NOT EXISTS `vn2008`; CREATE SCHEMA IF NOT EXISTS `vn2008`;
CREATE SCHEMA IF NOT EXISTS `tmp`; CREATE SCHEMA IF NOT EXISTS `tmp`;
CREATE ROLE 'salix';
GRANT 'salix' TO 'root'@'%';
SET DEFAULT ROLE 'salix' FOR 'root'@'%';
UPDATE `util`.`config` UPDATE `util`.`config`
SET `environment`= 'development'; SET `environment`= 'development';
@ -362,7 +370,7 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`,`typeFk`) INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`,`typeFk`)
VALUES VALUES
(1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','loses'), (1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'),
(1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), (1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'),
(1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), (1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'),
(1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), (1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'),
@ -372,8 +380,8 @@ INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city
(1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist','normal'), (1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist','normal'),
(1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist','normal'), (1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist','normal'),
(1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist','normal'), (1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist','normal'),
(1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','normal'), (1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','loses'),
(1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','normal'); (1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','loses');
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`) INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1 SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
@ -630,7 +638,7 @@ INSERT INTO `vn`.`invoiceOutTax` (`invoiceOutFk`, `taxableBase`, `vat`, `pgcFk`)
(4, 8.07, 0.81, 4770000010), (4, 8.07, 0.81, 4770000010),
(5, 8.07, 0.81, 4770000010); (5, 8.07, 0.81, 4770000010);
INSERT INTO `vn`.`expence`(`id`, `name`, `isWithheld`) INSERT INTO `vn`.`expense`(`id`, `name`, `isWithheld`)
VALUES VALUES
(2000000000, 'Inmovilizado pendiente', 0), (2000000000, 'Inmovilizado pendiente', 0),
(2000000001, 'Compra de bienes de inmovilizado', 0), (2000000001, 'Compra de bienes de inmovilizado', 0),
@ -642,7 +650,7 @@ INSERT INTO `vn`.`expence`(`id`, `name`, `isWithheld`)
(7050000000, 'Prestacion de servicios', 1); (7050000000, 'Prestacion de servicios', 1);
INSERT INTO `vn`.`invoiceOutExpence`(`id`, `invoiceOutFk`, `amount`, `expenceFk`, `created`) INSERT INTO `vn`.`invoiceOutExpense`(`id`, `invoiceOutFk`, `amount`, `expenseFk`, `created`)
VALUES VALUES
(1, 1, 813.06, 2000000000, util.VN_CURDATE()), (1, 1, 813.06, 2000000000, util.VN_CURDATE()),
(2, 1, 33.80, 4751000000, util.VN_CURDATE()), (2, 1, 33.80, 4751000000, util.VN_CURDATE()),
@ -922,7 +930,7 @@ INSERT INTO `vn`.`itemFamily`(`code`, `description`)
('SER', 'Services'), ('SER', 'Services'),
('VT', 'Sales'); ('VT', 'Sales');
INSERT INTO `vn`.`item`(`id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenceFk`, INSERT INTO `vn`.`item`(`id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenseFk`,
`comment`, `relevancy`, `image`, `subName`, `minPrice`, `stars`, `family`, `isFloramondo`, `genericFk`, `itemPackingTypeFk`, `hasMinPrice`, `packingShelve`, `weightByPiece`) `comment`, `relevancy`, `image`, `subName`, `minPrice`, `stars`, `family`, `isFloramondo`, `genericFk`, `itemPackingTypeFk`, `hasMinPrice`, `packingShelve`, `weightByPiece`)
VALUES VALUES
(1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 1, 'EMB', 0, NULL, 'V', 0, 15,3), (1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 1, 'EMB', 0, NULL, 'V', 0, 15,3),
@ -1939,7 +1947,7 @@ INSERT INTO `vn`.`ticketRequest`(`id`, `description`, `requesterFk`, `attenderFk
(4, 'Melee weapon combat first 15cm', 18, 35, 15, NULL, 1.30, NULL, NULL, 11, util.VN_CURDATE()), (4, 'Melee weapon combat first 15cm', 18, 35, 15, NULL, 1.30, NULL, NULL, 11, util.VN_CURDATE()),
(5, 'Melee weapon combat first 15cm', 18, 35, 15, 4, 1.30, 0, NULL, 18, util.VN_CURDATE()); (5, 'Melee weapon combat first 15cm', 18, 35, 15, 4, 1.30, 0, NULL, 18, util.VN_CURDATE());
INSERT INTO `vn`.`ticketServiceType`(`id`, `name`, `expenceFk`) INSERT INTO `vn`.`ticketServiceType`(`id`, `name`, `expenseFk`)
VALUES VALUES
(1, 'Porte Agencia', 7001000000), (1, 'Porte Agencia', 7001000000),
(2, 'Portes Retorno', 7001000000), (2, 'Portes Retorno', 7001000000),
@ -2561,7 +2569,7 @@ INSERT INTO `vn`.`duaInvoiceIn`(`id`, `duaFk`, `invoiceInFk`)
(9, 9, 9), (9, 9, 9),
(10, 10, 10); (10, 10, 10);
INSERT INTO `vn`.`invoiceInTax` (`invoiceInFk`, `taxableBase`, `expenceFk`, `foreignValue`, `taxTypeSageFk`, `transactionTypeSageFk`) INSERT INTO `vn`.`invoiceInTax` (`invoiceInFk`, `taxableBase`, `expenseFk`, `foreignValue`, `taxTypeSageFk`, `transactionTypeSageFk`)
VALUES VALUES
(1, 99.99, '2000000000', NULL, NULL, NULL), (1, 99.99, '2000000000', NULL, NULL, NULL),
(2, 999.99, '2000000000', NULL, NULL, NULL), (2, 999.99, '2000000000', NULL, NULL, NULL),

View File

@ -9692,7 +9692,7 @@ proc: BEGIN
`name`, `name`,
longName, longName,
subName, subName,
expenceFk, expenseFk,
typeFk, typeFk,
intrastatFk, intrastatFk,
originFk, originFk,
@ -10080,7 +10080,7 @@ BEGIN
`name`, `name`,
longName, longName,
subName, subName,
expenceFk, expenseFk,
typeFk, typeFk,
intrastatFk, intrastatFk,
originFk, originFk,
@ -17338,7 +17338,7 @@ BEGIN
JOIN vn.XDiario x ON x.id = mci.id JOIN vn.XDiario x ON x.id = mci.id
JOIN vn.supplier s ON s.id = supplierFk JOIN vn.supplier s ON s.id = supplierFk
JOIN vn.invoiceInTax iit ON iit.invoiceInFk = ii.id JOIN vn.invoiceInTax iit ON iit.invoiceInFk = ii.id
JOIN vn.expence e ON e.id = iit.expenceFk JOIN vn.expense e ON e.id = iit.expenseFk
JOIN TiposRetencion t ON t.CodigoRetencion = ii.withholdingSageFk JOIN TiposRetencion t ON t.CodigoRetencion = ii.withholdingSageFk
LEFT JOIN tmp.invoiceDua id ON id.id = mci.id LEFT JOIN tmp.invoiceDua id ON id.id = mci.id
JOIN (SELECT SUM(x2.BASEEURO) taxableBase, SUM(x2.EURODEBE) taxBase JOIN (SELECT SUM(x2.BASEEURO) taxableBase, SUM(x2.EURODEBE) taxBase
@ -17441,7 +17441,7 @@ BEGIN
i.serial COLLATE utf8mb3_unicode_ci serial, i.serial COLLATE utf8mb3_unicode_ci serial,
i.supplierFk, i.supplierFk,
i.issued, i.issued,
IF(expenceFkDeductible, FALSE, i.isVatDeductible) isVatDeductible, IF(expenseFkDeductible, FALSE, i.isVatDeductible) isVatDeductible,
IF(c.code = 'EUR', '',c.`code`) currencyFk IF(c.code = 'EUR', '',c.`code`) currencyFk
FROM vn.invoiceIn i FROM vn.invoiceIn i
JOIN vn.currency c ON c.id = i.currencyFk JOIN vn.currency c ON c.id = i.currencyFk
@ -17949,7 +17949,7 @@ BEGIN
e.id accountFk, e.id accountFk,
UCASE(e.name), UCASE(e.name),
'' ''
FROM vn.expence e FROM vn.expense e
UNION UNION
SELECT company_getCode(vCompanyFk), SELECT company_getCode(vCompanyFk),
b.account, b.account,
@ -22010,7 +22010,7 @@ DROP TABLE IF EXISTS `agencyTermConfig`;
/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `agencyTermConfig` ( CREATE TABLE `agencyTermConfig` (
`expenceFk` varchar(10) DEFAULT NULL, `expenseFk` varchar(10) DEFAULT NULL,
`vatAccountSupported` varchar(15) DEFAULT NULL, `vatAccountSupported` varchar(15) DEFAULT NULL,
`vatPercentage` decimal(28,10) DEFAULT NULL, `vatPercentage` decimal(28,10) DEFAULT NULL,
`transaction` varchar(50) DEFAULT NULL `transaction` varchar(50) DEFAULT NULL
@ -29097,19 +29097,19 @@ SET character_set_client = utf8;
SET character_set_client = @saved_cs_client; SET character_set_client = @saved_cs_client;
-- --
-- Table structure for table `expence` -- Table structure for table `expense`
-- --
DROP TABLE IF EXISTS `expence`; DROP TABLE IF EXISTS `expense`;
/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `expence` ( CREATE TABLE `expense` (
`id` varchar(10) NOT NULL, `id` varchar(10) NOT NULL,
`name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL, `name` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL,
`isWithheld` tinyint(4) NOT NULL DEFAULT 0, `isWithheld` tinyint(4) NOT NULL DEFAULT 0,
`code` varchar(25) DEFAULT NULL, `code` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `expence_UN` (`code`) UNIQUE KEY `expense_UN` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
@ -29862,7 +29862,7 @@ CREATE TABLE `invoiceIn` (
`bookEntried` date DEFAULT NULL COMMENT 'Fecha Asiento', `bookEntried` date DEFAULT NULL COMMENT 'Fecha Asiento',
`isVatDeductible` tinyint(1) NOT NULL DEFAULT 1, `isVatDeductible` tinyint(1) NOT NULL DEFAULT 1,
`withholdingSageFk` smallint(6) DEFAULT NULL COMMENT 'Tipos de retención SAGE', `withholdingSageFk` smallint(6) DEFAULT NULL COMMENT 'Tipos de retención SAGE',
`expenceFkDeductible` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, `expenseFkDeductible` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`editorFk` int(10) unsigned DEFAULT NULL, `editorFk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `proveedor_id` (`supplierFk`), KEY `proveedor_id` (`supplierFk`),
@ -29877,12 +29877,12 @@ CREATE TABLE `invoiceIn` (
KEY `recibida_ibfk_6` (`cplusRectificationTypeFk`), KEY `recibida_ibfk_6` (`cplusRectificationTypeFk`),
KEY `recibida_ibfk_7` (`siiTrascendencyInvoiceInFk`), KEY `recibida_ibfk_7` (`siiTrascendencyInvoiceInFk`),
KEY `invoiceIn_withholdingFk_idx` (`withholdingSageFk`), KEY `invoiceIn_withholdingFk_idx` (`withholdingSageFk`),
KEY `invoiceIn_expenceFkDeductible_idx` (`expenceFkDeductible`), KEY `invoiceIn_expenseFkDeductible_idx` (`expenseFkDeductible`),
KEY `invoiceIn_fk_editor` (`editorFk`), KEY `invoiceIn_fk_editor` (`editorFk`),
KEY `invoiceIn_FK` (`currencyFk`), KEY `invoiceIn_FK` (`currencyFk`),
CONSTRAINT `invoiceInCompany_Fk` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceInCompany_Fk` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceIn_FK` FOREIGN KEY (`currencyFk`) REFERENCES `currency` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceIn_FK` FOREIGN KEY (`currencyFk`) REFERENCES `currency` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceIn_expenceFkDeductible` FOREIGN KEY (`expenceFkDeductible`) REFERENCES `expence` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceIn_expenseFkDeductible` FOREIGN KEY (`expenseFkDeductible`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceIn_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`), CONSTRAINT `invoiceIn_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
CONSTRAINT `invoiceIn_ibfk_3` FOREIGN KEY (`cplusSubjectOpFk`) REFERENCES `cplusSubjectOp` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceIn_ibfk_3` FOREIGN KEY (`cplusSubjectOpFk`) REFERENCES `cplusSubjectOp` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceIn_ibfk_4` FOREIGN KEY (`cplusTaxBreakFk`) REFERENCES `cplusTaxBreak` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceIn_ibfk_4` FOREIGN KEY (`cplusTaxBreakFk`) REFERENCES `cplusTaxBreak` (`id`) ON UPDATE CASCADE,
@ -30283,7 +30283,7 @@ CREATE TABLE `invoiceInSage` (
`taxTypeSageFk` smallint(6) NOT NULL, `taxTypeSageFk` smallint(6) NOT NULL,
`transactionTypeSageFk` tinyint(4) NOT NULL, `transactionTypeSageFk` tinyint(4) NOT NULL,
`isService` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Para diferenciar producto de servicio', `isService` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Para diferenciar producto de servicio',
`expenceFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `expenseFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`withholdingSageFk` smallint(6) DEFAULT NULL, `withholdingSageFk` smallint(6) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `invoiceInSafe_unique` (`taxClassFk`,`invoiceInSerialFk`,`isService`,`withholdingSageFk`), UNIQUE KEY `invoiceInSafe_unique` (`taxClassFk`,`invoiceInSerialFk`,`isService`,`withholdingSageFk`),
@ -30292,8 +30292,8 @@ CREATE TABLE `invoiceInSage` (
KEY `invoiceInSage_invoiceInSerialFk` (`invoiceInSerialFk`), KEY `invoiceInSage_invoiceInSerialFk` (`invoiceInSerialFk`),
KEY `invoiceInSage_taxTypeSageFk` (`taxTypeSageFk`), KEY `invoiceInSage_taxTypeSageFk` (`taxTypeSageFk`),
KEY `invoiceInSage_transactionTypeSageFk` (`transactionTypeSageFk`), KEY `invoiceInSage_transactionTypeSageFk` (`transactionTypeSageFk`),
KEY `invoiceInSage_idx` (`expenceFk`), KEY `invoiceInSage_idx` (`expenseFk`),
CONSTRAINT `invoiceInSage_expenceFk` FOREIGN KEY (`expenceFk`) REFERENCES `expence` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceInSage_expenseFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceInSage_invoiceInSerialFk` FOREIGN KEY (`invoiceInSerialFk`) REFERENCES `invoiceInSerial` (`code`) ON UPDATE CASCADE, CONSTRAINT `invoiceInSage_invoiceInSerialFk` FOREIGN KEY (`invoiceInSerialFk`) REFERENCES `invoiceInSerial` (`code`) ON UPDATE CASCADE,
CONSTRAINT `invoiceInSage_taxClassFk` FOREIGN KEY (`taxClassFk`) REFERENCES `taxClass` (`code`) ON UPDATE CASCADE, CONSTRAINT `invoiceInSage_taxClassFk` FOREIGN KEY (`taxClassFk`) REFERENCES `taxClass` (`code`) ON UPDATE CASCADE,
CONSTRAINT `invoiceInSage_taxTypeSageFk` FOREIGN KEY (`taxTypeSageFk`) REFERENCES `sage`.`TiposIva` (`CodigoIva`) ON UPDATE CASCADE, CONSTRAINT `invoiceInSage_taxTypeSageFk` FOREIGN KEY (`taxTypeSageFk`) REFERENCES `sage`.`TiposIva` (`CodigoIva`) ON UPDATE CASCADE,
@ -30334,7 +30334,7 @@ CREATE TABLE `invoiceInTax` (
`invoiceInFk` mediumint(8) unsigned NOT NULL, `invoiceInFk` mediumint(8) unsigned NOT NULL,
`taxCodeFk` int(10) DEFAULT NULL, `taxCodeFk` int(10) DEFAULT NULL,
`taxableBase` decimal(10,2) NOT NULL, `taxableBase` decimal(10,2) NOT NULL,
`expenceFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `expenseFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`foreignValue` decimal(10,2) DEFAULT NULL, `foreignValue` decimal(10,2) DEFAULT NULL,
`taxTypeSageFk` smallint(6) DEFAULT NULL COMMENT 'Tipo de IVA SAGE', `taxTypeSageFk` smallint(6) DEFAULT NULL COMMENT 'Tipo de IVA SAGE',
`transactionTypeSageFk` tinyint(4) DEFAULT NULL COMMENT 'Tipo de transacción SAGE', `transactionTypeSageFk` tinyint(4) DEFAULT NULL COMMENT 'Tipo de transacción SAGE',
@ -30345,9 +30345,9 @@ CREATE TABLE `invoiceInTax` (
KEY `recibida_iva_ibfk_2` (`taxCodeFk`), KEY `recibida_iva_ibfk_2` (`taxCodeFk`),
KEY `recibida_iva_taxTypeSageFk` (`taxTypeSageFk`), KEY `recibida_iva_taxTypeSageFk` (`taxTypeSageFk`),
KEY `invoiceInTax_transactionTypeSageFk_idx` (`transactionTypeSageFk`), KEY `invoiceInTax_transactionTypeSageFk_idx` (`transactionTypeSageFk`),
KEY `invoiceInTax_idx` (`expenceFk`), KEY `invoiceInTax_idx` (`expenseFk`),
KEY `invoiceInTax_fk_editor` (`editorFk`), KEY `invoiceInTax_fk_editor` (`editorFk`),
CONSTRAINT `invoiceInTax_expenceFk` FOREIGN KEY (`expenceFk`) REFERENCES `expence` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceInTax_expenseFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceInTax_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`), CONSTRAINT `invoiceInTax_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
CONSTRAINT `invoiceInTax_ibfk_5` FOREIGN KEY (`invoiceInFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `invoiceInTax_ibfk_5` FOREIGN KEY (`invoiceInFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `invoiceInTax_transactionTypeSageFk` FOREIGN KEY (`transactionTypeSageFk`) REFERENCES `sage`.`TiposTransacciones` (`CodigoTransaccion`) ON UPDATE CASCADE, CONSTRAINT `invoiceInTax_transactionTypeSageFk` FOREIGN KEY (`transactionTypeSageFk`) REFERENCES `sage`.`TiposTransacciones` (`CodigoTransaccion`) ON UPDATE CASCADE,
@ -30615,23 +30615,23 @@ CREATE TABLE `invoiceOutConfig` (
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
-- --
-- Table structure for table `invoiceOutExpence` -- Table structure for table `invoiceOutExpense`
-- --
DROP TABLE IF EXISTS `invoiceOutExpence`; DROP TABLE IF EXISTS `invoiceOutExpense`;
/*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `invoiceOutExpence` ( CREATE TABLE `invoiceOutExpense` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`invoiceOutFk` int(10) unsigned NOT NULL, `invoiceOutFk` int(10) unsigned NOT NULL,
`amount` decimal(10,2) NOT NULL DEFAULT 0.00, `amount` decimal(10,2) NOT NULL DEFAULT 0.00,
`expenceFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `expenseFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`created` timestamp NULL DEFAULT current_timestamp(), `created` timestamp NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `invoiceOutExpence_FK_1_idx` (`invoiceOutFk`), KEY `invoiceOutExpense_FK_1_idx` (`invoiceOutFk`),
KEY `invoiceOutExpence_expenceFk_idx` (`expenceFk`), KEY `invoiceOutExpense_expenseFk_idx` (`expenseFk`),
CONSTRAINT `invoiceOutExpence_FK_1` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `invoiceOutExpense_FK_1` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `invoiceOutExpence_expenceFk` FOREIGN KEY (`expenceFk`) REFERENCES `expence` (`id`) ON UPDATE CASCADE CONSTRAINT `invoiceOutExpense_expenseFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDBDEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Desglosa la base imponible de una factura en funcion del tipo de gasto/venta'; ) ENGINE=InnoDBDEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Desglosa la base imponible de una factura en funcion del tipo de gasto/venta';
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
@ -30694,7 +30694,7 @@ CREATE TABLE `invoiceOutTaxConfig` (
`taxTypeSageFk` smallint(6) DEFAULT NULL, `taxTypeSageFk` smallint(6) DEFAULT NULL,
`transactionTypeSageFk` tinyint(4) DEFAULT NULL, `transactionTypeSageFk` tinyint(4) DEFAULT NULL,
`isService` tinyint(1) DEFAULT 0, `isService` tinyint(1) DEFAULT 0,
`expenceFk` varchar(10) DEFAULT NULL, `expenseFk` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `invoiceOutTaxConfig_FK` (`taxClassCodeFk`), KEY `invoiceOutTaxConfig_FK` (`taxClassCodeFk`),
KEY `invoiceOutTaxConfig_FK_1` (`taxTypeSageFk`), KEY `invoiceOutTaxConfig_FK_1` (`taxTypeSageFk`),
@ -30737,7 +30737,7 @@ CREATE TABLE `item` (
`description` varchar(1000) DEFAULT NULL, `description` varchar(1000) DEFAULT NULL,
`density` int(11) NOT NULL DEFAULT 167 COMMENT 'Almacena la densidad en kg/m3 para el calculo de los portes, si no se especifica se pone por defecto la del tipo en un trigger', `density` int(11) NOT NULL DEFAULT 167 COMMENT 'Almacena la densidad en kg/m3 para el calculo de los portes, si no se especifica se pone por defecto la del tipo en un trigger',
`relevancy` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'La web ordena de forma descendiente por este campo para mostrar los artículos', `relevancy` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'La web ordena de forma descendiente por este campo para mostrar los artículos',
`expenceFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '7001000000', `expenseFk` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '7001000000',
`isActive` tinyint(1) NOT NULL DEFAULT 1, `isActive` tinyint(1) NOT NULL DEFAULT 1,
`longName` varchar(50) DEFAULT NULL, `longName` varchar(50) DEFAULT NULL,
`subName` varchar(50) DEFAULT NULL, `subName` varchar(50) DEFAULT NULL,
@ -30792,11 +30792,11 @@ CREATE TABLE `item` (
KEY `item_size_IDX` (`size`) USING BTREE, KEY `item_size_IDX` (`size`) USING BTREE,
KEY `item_size_IDX2` (`longName`) USING BTREE, KEY `item_size_IDX2` (`longName`) USING BTREE,
KEY `item_lastUsed_IDX` (`lastUsed`) USING BTREE, KEY `item_lastUsed_IDX` (`lastUsed`) USING BTREE,
KEY `item_expenceFk_idx` (`expenceFk`), KEY `item_expenseFk_idx` (`expenseFk`),
KEY `item_fk_editor` (`editorFk`), KEY `item_fk_editor` (`editorFk`),
CONSTRAINT `item_FK` FOREIGN KEY (`genericFk`) REFERENCES `item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `item_FK` FOREIGN KEY (`genericFk`) REFERENCES `item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `item_FK_1` FOREIGN KEY (`typeFk`) REFERENCES `itemType` (`id`), CONSTRAINT `item_FK_1` FOREIGN KEY (`typeFk`) REFERENCES `itemType` (`id`),
CONSTRAINT `item_expenceFk` FOREIGN KEY (`expenceFk`) REFERENCES `expence` (`id`) ON UPDATE CASCADE, CONSTRAINT `item_expenseFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
CONSTRAINT `item_family` FOREIGN KEY (`family`) REFERENCES `itemFamily` (`code`) ON UPDATE CASCADE, CONSTRAINT `item_family` FOREIGN KEY (`family`) REFERENCES `itemFamily` (`code`) ON UPDATE CASCADE,
CONSTRAINT `item_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`), CONSTRAINT `item_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
CONSTRAINT `item_ibfk_1` FOREIGN KEY (`originFk`) REFERENCES `origin` (`id`) ON UPDATE CASCADE, CONSTRAINT `item_ibfk_1` FOREIGN KEY (`originFk`) REFERENCES `origin` (`id`) ON UPDATE CASCADE,
@ -40606,10 +40606,10 @@ DROP TABLE IF EXISTS `ticketServiceType`;
CREATE TABLE `ticketServiceType` ( CREATE TABLE `ticketServiceType` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL, `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
`expenceFk` varchar(10) NOT NULL DEFAULT '7050000000', `expenseFk` varchar(10) NOT NULL DEFAULT '7050000000',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
KEY `ticketServiceType_expenceFk_idx` (`expenceFk`), KEY `ticketServiceType_expenseFk_idx` (`expenseFk`),
CONSTRAINT `ticketServiceType_expenceFk` FOREIGN KEY (`expenceFk`) REFERENCES `expence` (`id`) ON UPDATE CASCADE CONSTRAINT `ticketServiceType_expenseFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDBDEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='Lista de los posibles servicios a elegir'; ) ENGINE=InnoDBDEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='Lista de los posibles servicios a elegir';
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
@ -46533,7 +46533,7 @@ BEGIN
WHERE io.ref = vInvoiceRef WHERE io.ref = vInvoiceRef
UNION ALL UNION ALL
SELECT ioe.amount SELECT ioe.amount
FROM invoiceOutExpence ioe FROM invoiceOutExpense ioe
JOIN invoiceOut io ON io.id = ioe.invoiceOutFk JOIN invoiceOut io ON io.id = ioe.invoiceOutFk
WHERE io.ref = vInvoiceRef WHERE io.ref = vInvoiceRef
) t1; ) t1;
@ -57741,7 +57741,7 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ; /*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; /*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `invoiceExpenceMake` */; /*!50003 DROP PROCEDURE IF EXISTS `invoiceExpenseMake` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ;
@ -57749,28 +57749,28 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;; DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenceMake`(IN vInvoice INT) CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenseMake`(IN vInvoice INT)
BEGIN BEGIN
/* Inserta las partidas de gasto correspondientes a la factura /* Inserta las partidas de gasto correspondientes a la factura
* REQUIERE tabla tmp.ticketToInvoice * REQUIERE tabla tmp.ticketToInvoice
* @param vInvoice Numero de factura * @param vInvoice Numero de factura
*/ */
DELETE FROM invoiceOutExpence DELETE FROM invoiceOutExpense
WHERE invoiceOutFk = vInvoice; WHERE invoiceOutFk = vInvoice;
INSERT INTO invoiceOutExpence(invoiceOutFk, expenceFk, amount) INSERT INTO invoiceOutExpense(invoiceOutFk, expenseFk, amount)
SELECT vInvoice, SELECT vInvoice,
expenceFk, expenseFk,
SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount
FROM tmp.ticketToInvoice t FROM tmp.ticketToInvoice t
JOIN sale s ON s.ticketFk = t.id JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk JOIN item i ON i.id = s.itemFk
GROUP BY i.expenceFk GROUP BY i.expenseFk
HAVING amount != 0; HAVING amount != 0;
INSERT INTO invoiceOutExpence(invoiceOutFk, expenceFk, amount) INSERT INTO invoiceOutExpense(invoiceOutFk, expenseFk, amount)
SELECT vInvoice, SELECT vInvoice,
tst.expenceFk, tst.expenseFk,
SUM(ROUND(ts.quantity * ts.price ,2)) amount SUM(ROUND(ts.quantity * ts.price ,2)) amount
FROM tmp.ticketToInvoice t FROM tmp.ticketToInvoice t
JOIN ticketService ts ON ts.ticketFk = t.id JOIN ticketService ts ON ts.ticketFk = t.id
@ -58125,7 +58125,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceInTax_getFromEntries`(IN vId
BEGIN BEGIN
DECLARE vRate DOUBLE DEFAULT 1; DECLARE vRate DOUBLE DEFAULT 1;
DECLARE vDated DATE; DECLARE vDated DATE;
DECLARE vExpenceFk VARCHAR(10); DECLARE vExpenseFk VARCHAR(10);
SELECT MAX(rr.dated) INTO vDated SELECT MAX(rr.dated) INTO vDated
FROM referenceRate rr FROM referenceRate rr
@ -58139,8 +58139,8 @@ BEGIN
WHERE dated = vDated; WHERE dated = vDated;
END IF; END IF;
SELECT id INTO vExpenceFk SELECT id INTO vExpenseFk
FROM vn.expence FROM vn.expense
WHERE `name` = 'Adquisición mercancia Extracomunitaria' WHERE `name` = 'Adquisición mercancia Extracomunitaria'
GROUP BY id GROUP BY id
LIMIT 1; LIMIT 1;
@ -58148,10 +58148,10 @@ BEGIN
DELETE FROM invoiceInTax DELETE FROM invoiceInTax
WHERE invoiceInFk = vId; WHERE invoiceInFk = vId;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, foreignValue, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, foreignValue, taxTypeSageFk, transactionTypeSageFk)
SELECT ii.id, SELECT ii.id,
SUM(b.buyingValue * b.quantity) / IFNULL(vRate,1) taxableBase, SUM(b.buyingValue * b.quantity) / IFNULL(vRate,1) taxableBase,
vExpenceFk, vExpenseFk,
IF(ii.currencyFk = 1,NULL,SUM(b.buyingValue * b.quantity )) divisa, IF(ii.currencyFk = 1,NULL,SUM(b.buyingValue * b.quantity )) divisa,
taxTypeSageFk, taxTypeSageFk,
transactionTypeSageFk transactionTypeSageFk
@ -58188,7 +58188,7 @@ BEGIN
SELECT ii.bookEntried, SELECT ii.bookEntried,
iit.foreignValue, iit.foreignValue,
ii.companyFk, ii.companyFk,
ii.expenceFkDeductible, ii.expenseFkDeductible,
iit.taxableBase, iit.taxableBase,
iit.transactionTypeSageFk, iit.transactionTypeSageFk,
ii.serial, ii.serial,
@ -58218,8 +58218,8 @@ BEGIN
cit.id invoicesCount, cit.id invoicesCount,
e.code, e.code,
e.isWithheld, e.isWithheld,
e.id expenceFk, e.id expenseFk,
e.name expenceName e.name expenseName
FROM invoiceIn ii FROM invoiceIn ii
JOIN supplier s ON s.id = ii.supplierFk JOIN supplier s ON s.id = ii.supplierFk
LEFT JOIN province p ON p.id = s.provinceFk LEFT JOIN province p ON p.id = s.provinceFk
@ -58231,7 +58231,7 @@ BEGIN
JOIN siiTypeInvoiceIn cit ON cit.id = ii.siiTypeInvoiceInFk JOIN siiTypeInvoiceIn cit ON cit.id = ii.siiTypeInvoiceInFk
LEFT JOIN invoiceInTax iit ON iit.invoiceInFk = ii.id LEFT JOIN invoiceInTax iit ON iit.invoiceInFk = ii.id
LEFT JOIN sage.TiposTransacciones ttr ON ttr.CodigoTransaccion = iit.transactionTypeSageFk LEFT JOIN sage.TiposTransacciones ttr ON ttr.CodigoTransaccion = iit.transactionTypeSageFk
LEFT JOIN expence e ON e.id = iit.expenceFk LEFT JOIN expense e ON e.id = iit.expenseFk
LEFT JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk LEFT JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
LEFT JOIN sage.taxType tt ON tt.id = ti.CodigoIva LEFT JOIN sage.taxType tt ON tt.id = ti.CodigoIva
WHERE ii.id = vSelf; WHERE ii.id = vSelf;
@ -58286,7 +58286,7 @@ BEGIN
empresa_id) empresa_id)
SELECT vBookNumber ASIEN, SELECT vBookNumber ASIEN,
tii.bookEntried FECHA, tii.bookEntried FECHA,
IF(tii.isWithheld, LPAD(RIGHT(tii.supplierAccount, 5), 10, tii.expenceFk),tii.expenceFk) SUBCTA, IF(tii.isWithheld, LPAD(RIGHT(tii.supplierAccount, 5), 10, tii.expenseFk),tii.expenseFk) SUBCTA,
tii.supplierAccount CONTRA, tii.supplierAccount CONTRA,
IF(tii.isWithheld AND tii.taxableBase < 0, NULL, ROUND(SUM(tii.taxableBase),2)) EURODEBE, IF(tii.isWithheld AND tii.taxableBase < 0, NULL, ROUND(SUM(tii.taxableBase),2)) EURODEBE,
IF(tii.isWithheld AND tii.taxableBase < 0, ROUND(SUM(-tii.taxableBase), 2), NULL) EUROHABER, IF(tii.isWithheld AND tii.taxableBase < 0, ROUND(SUM(-tii.taxableBase), 2), NULL) EUROHABER,
@ -58301,7 +58301,7 @@ BEGIN
tii.companyFk empresa_id tii.companyFk empresa_id
FROM tInvoiceIn tii FROM tInvoiceIn tii
WHERE tii.code IS NULL OR tii.code <> 'suplido' WHERE tii.code IS NULL OR tii.code <> 'suplido'
GROUP BY tii.expenceFk; GROUP BY tii.expenseFk;
-- Líneas de IVA -- Líneas de IVA
INSERT INTO XDiario( INSERT INTO XDiario(
@ -58335,11 +58335,11 @@ BEGIN
empresa_id) empresa_id)
SELECT vBookNumber ASIEN, SELECT vBookNumber ASIEN,
tii.bookEntried FECHA, tii.bookEntried FECHA,
IF(tii.expenceFkDeductible>0, tii.expenceFkDeductible, tii.CuentaIvaSoportado) SUBCTA, IF(tii.expenseFkDeductible>0, tii.expenseFkDeductible, tii.CuentaIvaSoportado) SUBCTA,
tii.supplierAccount CONTRA, tii.supplierAccount CONTRA,
SUM(ROUND(tii.PorcentajeIva * tii.taxableBase / 100, 2)) EURODEBE, SUM(ROUND(tii.PorcentajeIva * tii.taxableBase / 100, 2)) EURODEBE,
SUM(tii.taxableBase) BASEEURO, SUM(tii.taxableBase) BASEEURO,
GROUP_CONCAT(DISTINCT tii.expenceName SEPARATOR ', ') CONCEPTO, GROUP_CONCAT(DISTINCT tii.expenseName SEPARATOR ', ') CONCEPTO,
vSelf FACTURA, vSelf FACTURA,
tii.PorcentajeIva IVA, tii.PorcentajeIva IVA,
IF(tii.isUeeMember AND eWithheld.id IS NULL, '', '*') AUXILIAR, IF(tii.isUeeMember AND eWithheld.id IS NULL, '', '*') AUXILIAR,
@ -58365,13 +58365,13 @@ BEGIN
LEFT JOIN ( LEFT JOIN (
SELECT e.id SELECT e.id
FROM tInvoiceIn tii FROM tInvoiceIn tii
JOIN expence e ON e.id = tii.expenceFk JOIN expense e ON e.id = tii.expenseFk
WHERE e.isWithheld WHERE e.isWithheld
LIMIT 1 LIMIT 1
) eWithheld ON TRUE ) eWithheld ON TRUE
WHERE tii.taxTypeSageFk IS NOT NULL WHERE tii.taxTypeSageFk IS NOT NULL
AND (tii.taxCode IS NULL OR tii.taxCode NOT IN ('import10', 'import21')) AND (tii.taxCode IS NULL OR tii.taxCode NOT IN ('import10', 'import21'))
GROUP BY tii.PorcentajeIva, tii.expenceFk; GROUP BY tii.PorcentajeIva, tii.expenseFk;
-- Línea iva inversor sujeto pasivo -- Línea iva inversor sujeto pasivo
INSERT INTO XDiario( INSERT INTO XDiario(
@ -58408,7 +58408,7 @@ BEGIN
tii.supplierAccount CONTRA, tii.supplierAccount CONTRA,
SUM(ROUND(tii.PorcentajeIva * tii.taxableBase / 100,2)) EUROHABER, SUM(ROUND(tii.PorcentajeIva * tii.taxableBase / 100,2)) EUROHABER,
ROUND(SUM(tii.taxableBase),2) BASEEURO, ROUND(SUM(tii.taxableBase),2) BASEEURO,
GROUP_CONCAT(DISTINCT tii.expenceName SEPARATOR ', ') CONCEPTO, GROUP_CONCAT(DISTINCT tii.expenseName SEPARATOR ', ') CONCEPTO,
vSelf FACTURA, vSelf FACTURA,
tii.PorcentajeIva IVA, tii.PorcentajeIva IVA,
'*' AUXILIAR, '*' AUXILIAR,
@ -58436,7 +58436,7 @@ BEGIN
AND NOT(tii.isVies AND NOT(tii.isVies
AND c.nontaxableTransactionTypeFk = tii.transactionTypeSageFk AND c.nontaxableTransactionTypeFk = tii.transactionTypeSageFk
AND tii.taxCode = 'nonTaxable') AND tii.taxCode = 'nonTaxable')
GROUP BY tii.PorcentajeIva, tii.expenceFk; GROUP BY tii.PorcentajeIva, tii.expenseFk;
-- Actualización del registro original -- Actualización del registro original
UPDATE invoiceIn ii UPDATE invoiceIn ii
@ -58509,14 +58509,14 @@ BEGIN
FROM ticket FROM ticket
WHERE refFk = vInvoiceRef; WHERE refFk = vInvoiceRef;
CALL invoiceExpenceMake(vInvoiceFk); CALL invoiceExpenseMake(vInvoiceFk);
CALL invoiceTaxMake(vInvoiceFk,vTaxArea); CALL invoiceTaxMake(vInvoiceFk,vTaxArea);
UPDATE invoiceOut io UPDATE invoiceOut io
JOIN ( JOIN (
SELECT SUM(amount) AS total SELECT SUM(amount) AS total
FROM invoiceOutExpence FROM invoiceOutExpense
WHERE invoiceOutFk = vInvoiceFk WHERE invoiceOutFk = vInvoiceFk
) base ) base
JOIN ( JOIN (
@ -58552,7 +58552,7 @@ BEGIN
* param vInvoice factura_id * param vInvoice factura_id
*/ */
DECLARE vBookNumber INT; DECLARE vBookNumber INT;
DECLARE vExpenceConcept VARCHAR(50); DECLARE vExpenseConcept VARCHAR(50);
DECLARE vSpainCountryFk INT; DECLARE vSpainCountryFk INT;
DECLARE vOldBookNumber INT; DECLARE vOldBookNumber INT;
@ -58644,7 +58644,7 @@ BEGIN
SELECT SELECT
vBookNumber AS ASIEN, vBookNumber AS ASIEN,
rs.FECHA, rs.FECHA,
ioe.expenceFk AS SUBCTA, ioe.expenseFk AS SUBCTA,
rs.clientBookingAccount AS CONTRA, rs.clientBookingAccount AS CONTRA,
ioe.amount AS EUROHABER, ioe.amount AS EUROHABER,
rs.Concept AS CONCEPTO, rs.Concept AS CONCEPTO,
@ -58652,13 +58652,13 @@ BEGIN
rs.FECHA_OP, rs.FECHA_OP,
rs.companyFk AS empresa_id rs.companyFk AS empresa_id
FROM rs FROM rs
JOIN invoiceOutExpence ioe JOIN invoiceOutExpense ioe
WHERE ioe.invoiceOutFk = vInvoice; WHERE ioe.invoiceOutFk = vInvoice;
SELECT GROUP_CONCAT(`name` SEPARATOR ',') SELECT GROUP_CONCAT(`name` SEPARATOR ',')
INTO vExpenceConcept INTO vExpenseConcept
FROM expence e FROM expense e
JOIN invoiceOutExpence ioe ON ioe.expenceFk = e.id JOIN invoiceOutExpense ioe ON ioe.expenseFk = e.id
WHERE ioe.invoiceOutFk = vInvoice; WHERE ioe.invoiceOutFk = vInvoice;
-- Lineas de IVA -- Lineas de IVA
@ -58701,7 +58701,7 @@ BEGIN
rs.clientBookingAccount AS CONTRA, rs.clientBookingAccount AS CONTRA,
iot.vat AS EUROHABER, iot.vat AS EUROHABER,
iot.taxableBase AS BASEEURO, iot.taxableBase AS BASEEURO,
CONCAT(vExpenceConcept,' : ',rs.Concept) AS CONCEPTO, CONCAT(vExpenseConcept,' : ',rs.Concept) AS CONCEPTO,
rs.invoiceNum AS FACTURA, rs.invoiceNum AS FACTURA,
IF(pe2.equFk,0,pgc.rate) AS IVA, IF(pe2.equFk,0,pgc.rate) AS IVA,
IF(pe2.equFk,0,pgce.rate) AS RECEQUIV, IF(pe2.equFk,0,pgce.rate) AS RECEQUIV,
@ -58844,7 +58844,7 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ; /*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; /*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `invoiceOutTaxAndExpence` */; /*!50003 DROP PROCEDURE IF EXISTS `invoiceOutTaxAndExpense` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ;
@ -58852,7 +58852,7 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;; DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOutTaxAndExpence`() CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOutTaxAndExpense`()
BEGIN BEGIN
/* Para tickets ya facturados, vuelve a repetir el proceso de facturación. /* Para tickets ya facturados, vuelve a repetir el proceso de facturación.
@ -58906,7 +58906,7 @@ BEGIN
FROM ticket FROM ticket
WHERE refFk = vInvoiceRef; WHERE refFk = vInvoiceRef;
CALL invoiceExpenceMake(vInvoice); CALL invoiceExpenseMake(vInvoice);
CALL invoiceTaxMake(vInvoice,vCountry,vTaxArea); CALL invoiceTaxMake(vInvoice,vCountry,vTaxArea);
FETCH rs INTO vInvoice ,vInvoiceRef; FETCH rs INTO vInvoice ,vInvoiceRef;
@ -59140,13 +59140,13 @@ BEGIN
INSERT INTO ticketTracking(stateFk,ticketFk,workerFk) INSERT INTO ticketTracking(stateFk,ticketFk,workerFk)
SELECT * FROM tmp.updateInter; SELECT * FROM tmp.updateInter;
CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceExpenseMake(vNewInvoiceId);
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
UPDATE invoiceOut io UPDATE invoiceOut io
JOIN ( JOIN (
SELECT SUM(amount) total SELECT SUM(amount) total
FROM invoiceOutExpence FROM invoiceOutExpense
WHERE invoiceOutFk = vNewInvoiceId WHERE invoiceOutFk = vNewInvoiceId
) base ) base
JOIN ( JOIN (
@ -59183,15 +59183,15 @@ BEGIN
SET @vTaxableBaseServices := 0.00; SET @vTaxableBaseServices := 0.00;
SET @vTaxCodeGeneral := NULL; SET @vTaxCodeGeneral := NULL;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
@vTaxableBaseServices, @vTaxableBaseServices,
sub.expenceFk, sub.expenseFk,
sub.taxTypeSageFk, sub.taxTypeSageFk,
sub.transactionTypeSageFk sub.transactionTypeSageFk
FROM ( FROM (
SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase, SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk, i.taxTypeSageFk,
i.transactionTypeSageFk, i.transactionTypeSageFk,
@vTaxCodeGeneral := i.taxClassCodeFk @vTaxCodeGeneral := i.taxClassCodeFk
@ -59201,11 +59201,11 @@ BEGIN
HAVING taxableBase HAVING taxableBase
) sub; ) sub;
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenseFk, taxTypeSageFk, transactionTypeSageFk)
SELECT vNewInvoiceInFk, SELECT vNewInvoiceInFk,
SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral,
@vTaxableBaseServices, 0) taxableBase, @vTaxableBaseServices, 0) taxableBase,
i.expenceFk, i.expenseFk,
i.taxTypeSageFk , i.taxTypeSageFk ,
i.transactionTypeSageFk i.transactionTypeSageFk
FROM tmp.ticketTax tt FROM tmp.ticketTax tt

View File

@ -199,5 +199,6 @@
"You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets", "You can only add negative amounts in refund tickets": "You can only add negative amounts in refund tickets",
"Try again": "Try again", "Try again": "Try again",
"keepPrice": "keepPrice", "keepPrice": "keepPrice",
"Cannot past travels with entries": "Cannot past travels with entries" "Cannot past travels with entries": "Cannot past travels with entries",
"It was not able to remove the next expeditions:": "It was not able to remove the next expeditions: {{expeditions}}"
} }

View File

@ -328,5 +328,6 @@
"User disabled": "Usuario desactivado", "User disabled": "Usuario desactivado",
"The amount cannot be less than the minimum": "La cantidad no puede ser menor que la cantidad mínima", "The amount cannot be less than the minimum": "La cantidad no puede ser menor que la cantidad mínima",
"quantityLessThanMin": "La cantidad no puede ser menor que la cantidad mínima", "quantityLessThanMin": "La cantidad no puede ser menor que la cantidad mínima",
"Cannot past travels with entries": "No se pueden pasar envíos con entradas" "Cannot past travels with entries": "No se pueden pasar envíos con entradas",
"It was not able to remove the next expeditions:": "No se pudo eliminar las siguientes expediciones: {{expeditions}}"
} }

View File

@ -1,3 +1,4 @@
const NotFoundError = require('vn-loopback/util/not-found-error');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('test', { Self.remoteMethod('test', {
@ -9,7 +10,8 @@ module.exports = Self => {
}); });
Self.test = async function() { Self.test = async function() {
let connector = await Self.getSynchronizer(); const connector = await Self.getLinker();
if (!connector) throw new NotFoundError('Linker not configured');
await connector.test(); await connector.test();
}; };
}; };

View File

@ -26,12 +26,19 @@ module.exports = Self => {
}); });
Self.sync = async function(userName, password, force, options) { Self.sync = async function(userName, password, force, options) {
const models = Self.app.models;
const myOptions = {}; const myOptions = {};
let tx;
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);
const models = Self.app.models; if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
};
try {
const user = await models.VnUser.findOne({ const user = await models.VnUser.findOne({
fields: ['id', 'password'], fields: ['id', 'password'],
where: {name: userName} where: {name: userName}
@ -42,8 +49,23 @@ module.exports = Self => {
const isSync = !await models.UserSync.exists(userName, myOptions); const isSync = !await models.UserSync.exists(userName, myOptions);
if (!force && isSync && user) return; if (!force && isSync && user) {
if (tx) await tx.rollback();
return;
}
await Self.rawSql(`
SELECT id
FROM account.user
WHERE id = ?
FOR UPDATE`, [user.id], myOptions);
await models.AccountConfig.syncUser(userName, password); await models.AccountConfig.syncUser(userName, password);
await models.UserSync.destroyById(userName, myOptions); await models.UserSync.destroyById(userName, myOptions);
if (tx) await tx.commit();
} catch (err) {
if (tx) await tx.rollback();
throw err;
}
}; };
}; };

View File

@ -3,14 +3,14 @@ const app = require('vn-loopback/server/server');
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
module.exports = function(Self, options) { module.exports = function(Self, options) {
require('../methods/account-synchronizer/test')(Self); require('../methods/account-linker/test')(Self);
Self.once('attached', function() { Self.once('attached', function() {
app.models.AccountConfig.addSynchronizer(Self); app.models.AccountConfig.addLinker(Self);
}); });
/** /**
* Mixin for user synchronizers. * Mixin for account linkers.
* *
* @property {Array<Model>} $ * @property {Array<Model>} $
* @property {Object} accountConfig * @property {Object} accountConfig
@ -18,12 +18,12 @@ module.exports = function(Self, options) {
*/ */
let Mixin = { let Mixin = {
/** /**
* Initalizes the synchronizer. * Initalizes the linker.
*/ */
async init() {}, async init() {},
/** /**
* Deinitalizes the synchronizer. * Deinitalizes the linker.
*/ */
async deinit() {}, async deinit() {},
@ -57,7 +57,7 @@ module.exports = function(Self, options) {
async syncRoles() {}, async syncRoles() {},
/** /**
* Tests synchronizer configuration. * Tests linker configuration.
*/ */
async test() { async test() {
try { try {

View File

@ -3,94 +3,85 @@ const models = require('vn-loopback/server/server').models;
module.exports = Self => { module.exports = Self => {
Object.assign(Self, { Object.assign(Self, {
synchronizers: [], linkers: [],
addSynchronizer(synchronizer) { addLinker(linker) {
this.synchronizers.push(synchronizer); this.linkers.push(linker);
}, },
async getInstance() { async initEngine() {
let instance = await Self.findOne({ const accountConfig = await Self.findOne({
fields: ['homedir', 'shell', 'idBase'] fields: ['homedir', 'shell', 'idBase']
}); });
await instance.synchronizerInit(); const mailConfig = await models.MailConfig.findOne({
return instance; fields: ['domain']
});
const linkers = [];
for (const Linker of Self.linkers) {
const linker = await Linker.getLinker();
if (!linker) continue;
Object.assign(linker, {accountConfig});
await linker.init();
linkers.push(linker);
}
Object.assign(accountConfig, {
linkers,
domain: mailConfig.domain
});
return {
accountConfig,
linkers
};
},
async deinitEngine(engine) {
for (const linker of engine.linkers)
await linker.deinit();
},
async syncUser(userName, password) {
const engine = await Self.initEngine();
try {
await Self.syncUserBase(engine, userName, password, true);
} finally {
await Self.deinitEngine(engine);
}
}, },
async syncUsers() { async syncUsers() {
let instance = await Self.getInstance(); const engine = await Self.initEngine();
let usersToSync = new Set();
for (const linker of engine.linkers)
await linker.getUsers(usersToSync);
let usersToSync = await instance.synchronizerGetUsers();
usersToSync = Array.from(usersToSync.values()) usersToSync = Array.from(usersToSync.values())
.sort((a, b) => a.localeCompare(b)); .sort((a, b) => a.localeCompare(b));
for (let userName of usersToSync) { for (let userName of usersToSync) {
try { try {
// eslint-disable-next-line no-console
console.log(`Synchronizing user '${userName}'`); console.log(`Synchronizing user '${userName}'`);
await instance.synchronizerSyncUser(userName);
await Self.syncUserBase(engine, userName);
// eslint-disable-next-line no-console
console.log(` -> User '${userName}' sinchronized`); console.log(` -> User '${userName}' sinchronized`);
} catch (err) { } catch (err) {
// eslint-disable-next-line no-console
console.error(` -> User '${userName}' synchronization error:`, err.message); console.error(` -> User '${userName}' synchronization error:`, err.message);
} }
} }
await instance.synchronizerDeinit(); await Self.deinitEngine(engine);
await Self.syncRoles(); await Self.syncRoles();
}, },
async syncUser(userName, password) { async syncUserBase(engine, userName, password, syncGroups) {
let instance = await Self.getInstance();
try {
await instance.synchronizerSyncUser(userName, password, true);
} finally {
await instance.synchronizerDeinit();
}
},
async syncRoles() {
let instance = await Self.getInstance();
try {
await instance.synchronizerSyncRoles();
} finally {
await instance.synchronizerDeinit();
}
},
async getSynchronizer() {
return await Self.findOne();
}
});
Object.assign(Self.prototype, {
async synchronizerInit() {
let mailConfig = await models.MailConfig.findOne({
fields: ['domain']
});
let synchronizers = [];
for (let Synchronizer of Self.synchronizers) {
let synchronizer = await Synchronizer.getSynchronizer();
if (!synchronizer) continue;
Object.assign(synchronizer, {
accountConfig: this
});
await synchronizer.init();
synchronizers.push(synchronizer);
}
Object.assign(this, {
synchronizers,
domain: mailConfig.domain
});
},
async synchronizerDeinit() {
for (let synchronizer of this.synchronizers)
await synchronizer.deinit();
},
async synchronizerSyncUser(userName, password, syncGroups) {
if (!userName) return; if (!userName) return;
userName = userName.toLowerCase(); userName = userName.toLowerCase();
@ -98,7 +89,7 @@ module.exports = Self => {
if (['administrator', 'root'].indexOf(userName) >= 0) if (['administrator', 'root'].indexOf(userName) >= 0)
return; return;
let user = await models.VnUser.findOne({ const user = await models.VnUser.findOne({
where: {name: userName}, where: {name: userName},
fields: [ fields: [
'id', 'id',
@ -130,27 +121,28 @@ module.exports = Self => {
] ]
}); });
let info = { const info = {
user, user,
hasAccount: false hasAccount: false
}; };
if (user) { if (user) {
let exists = await models.Account.exists(user.id); const exists = await models.Account.exists(user.id);
const {accountConfig} = engine;
Object.assign(info, { Object.assign(info, {
hasAccount: user.active && exists, hasAccount: user.active && exists,
corporateMail: `${userName}@${this.domain}`, corporateMail: `${userName}@${accountConfig.domain}`,
uidNumber: this.idBase + user.id uidNumber: accountConfig.idBase + user.id
}); });
} }
let errs = []; const errs = [];
for (let synchronizer of this.synchronizers) { for (const linker of engine.linkers) {
try { try {
await synchronizer.syncUser(userName, info, password); await linker.syncUser(userName, info, password);
if (syncGroups) if (syncGroups)
await synchronizer.syncUserGroups(userName, info); await linker.syncUserGroups(userName, info);
} catch (err) { } catch (err) {
errs.push(err); errs.push(err);
} }
@ -159,18 +151,16 @@ module.exports = Self => {
if (errs.length) throw errs[0]; if (errs.length) throw errs[0];
}, },
async synchronizerGetUsers() { async syncRoles() {
let usersToSync = new Set(); const engine = await Self.initEngine();
try {
await Self.rawSql(`CALL account.role_sync`);
for (let synchronizer of this.synchronizers) for (const linker of engine.linkers)
await synchronizer.getUsers(usersToSync); await linker.syncRoles();
} finally {
return usersToSync; await Self.deinitEngine(engine);
}, }
async synchronizerSyncRoles() {
for (let synchronizer of this.synchronizers)
await synchronizer.syncRoles();
} }
}); });
}; };

View File

@ -7,7 +7,7 @@ const nthash = require('smbhash').nthash;
module.exports = Self => { module.exports = Self => {
const shouldSync = process.env.NODE_ENV !== 'test'; const shouldSync = process.env.NODE_ENV !== 'test';
Self.getSynchronizer = async function() { Self.getLinker = async function() {
return await Self.findOne({ return await Self.findOne({
fields: [ fields: [
'server', 'server',
@ -24,6 +24,7 @@ module.exports = Self => {
this.client = ldap.createClient({ this.client = ldap.createClient({
url: this.server url: this.server
}); });
this.client.on('error', () => {});
await this.client.bind(this.rdn, this.password); await this.client.bind(this.rdn, this.password);
}, },

View File

@ -7,7 +7,7 @@
} }
}, },
"mixins": { "mixins": {
"AccountSynchronizer": {} "AccountLinker": {}
}, },
"properties": { "properties": {
"id": { "id": {

View File

@ -1,6 +1,6 @@
module.exports = Self => { module.exports = Self => {
Self.getSynchronizer = async function() { Self.getLinker = async function() {
let NODE_ENV = process.env.NODE_ENV; let NODE_ENV = process.env.NODE_ENV;
if (!NODE_ENV || NODE_ENV == 'development') if (!NODE_ENV || NODE_ENV == 'development')
return null; return null;
@ -45,6 +45,7 @@ module.exports = Self => {
} }
if (!isUpdatable) { if (!isUpdatable) {
// eslint-disable-next-line no-console
console.warn(`RoleConfig.syncUser(): User '${userName}' cannot be updated, not managed by me`); console.warn(`RoleConfig.syncUser(): User '${userName}' cannot be updated, not managed by me`);
return; return;
} }
@ -82,6 +83,7 @@ module.exports = Self => {
[mysqlUser, this.userHost]); [mysqlUser, this.userHost]);
} catch (err) { } catch (err) {
if (err.code == 'ER_REVOKE_GRANTS') if (err.code == 'ER_REVOKE_GRANTS')
// eslint-disable-next-line no-console
console.warn(`${err.code}: ${err.sqlMessage}: ${err.sql}`); console.warn(`${err.code}: ${err.sqlMessage}: ${err.sql}`);
else else
throw err; throw err;

View File

@ -7,7 +7,7 @@
} }
}, },
"mixins": { "mixins": {
"AccountSynchronizer": {} "AccountLinker": {}
}, },
"properties": { "properties": {
"id": { "id": {

View File

@ -9,7 +9,7 @@ module.exports = Self => {
Self.observe(hook, async() => { Self.observe(hook, async() => {
try { try {
await Self.rawSql(` await Self.rawSql(`
CREATE EVENT account.role_sync CREATE DEFINER = CURRENT_ROLE EVENT account.role_sync
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 SECOND ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 SECOND
DO CALL role_sync; DO CALL role_sync;
`); `);

View File

@ -13,7 +13,7 @@ const UserAccountControlFlags = {
module.exports = Self => { module.exports = Self => {
const shouldSync = process.env.NODE_ENV !== 'test'; const shouldSync = process.env.NODE_ENV !== 'test';
Self.getSynchronizer = async function() { Self.getLinker = async function() {
return await Self.findOne({ return await Self.findOne({
fields: [ fields: [
'host', 'host',
@ -39,6 +39,7 @@ module.exports = Self => {
url: `ldaps://${this.adController}:636`, url: `ldaps://${this.adController}:636`,
tlsOptions: {rejectUnauthorized: this.verifyCert} tlsOptions: {rejectUnauthorized: this.verifyCert}
}); });
adClient.on('error', () => {});
await adClient.bind(bindDn, this.adPassword); await adClient.bind(bindDn, this.adPassword);
Object.assign(this, { Object.assign(this, {
adClient, adClient,

View File

@ -7,7 +7,7 @@
} }
}, },
"mixins": { "mixins": {
"AccountSynchronizer": {} "AccountLinker": {}
}, },
"properties": { "properties": {
"id": { "id": {

View File

@ -26,6 +26,14 @@
}, },
"ip": { "ip": {
"type": "string" "type": "string"
},
"userName": {
"type": "string"
},
"owner": {
"type": "boolean",
"required": true,
"default": true
} }
}, },
"relations": { "relations": {

View File

@ -2,7 +2,7 @@
const app = require('vn-loopback/server/server'); const app = require('vn-loopback/server/server');
module.exports = Self => { module.exports = Self => {
Self.getSynchronizer = async function() { Self.getLinker = async function() {
return await Self.findOne({fields: ['id']}); return await Self.findOne({fields: ['id']});
}; };

View File

@ -7,7 +7,7 @@
} }
}, },
"mixins": { "mixins": {
"AccountSynchronizer": {} "AccountLinker": {}
}, },
"properties": { "properties": {
"id": { "id": {
@ -16,4 +16,3 @@
} }
} }
} }

View File

@ -68,7 +68,6 @@
Deactivate user Deactivate user
</vn-item> </vn-item>
<vn-item <vn-item
ng-if="$ctrl.user.active"
ng-click="syncUser.show()" ng-click="syncUser.show()"
name="synchronizeUser" name="synchronizeUser"
vn-acl="it" vn-acl="it"
@ -166,7 +165,7 @@
vn-id="syncUser" vn-id="syncUser"
on-accept="$ctrl.onSync()" on-accept="$ctrl.onSync()"
on-close="$ctrl.onSyncClose()"> on-close="$ctrl.onSyncClose()">
<tpl-title ng-translate> <tpl-title translate>
Do you want to synchronize user? Do you want to synchronize user?
</tpl-title> </tpl-title>
<tpl-body> <tpl-body>

View File

@ -16,5 +16,5 @@ columns:
bookEntried: book entried bookEntried: book entried
isVatDeductible: is VAT deductible isVatDeductible: is VAT deductible
withholdingSageFk: withholding withholdingSageFk: withholding
expenceFkDeductible: expence deductible expenseFkDeductible: expense deductible
editorFk: editor editorFk: editor

View File

@ -16,5 +16,5 @@ columns:
bookEntried: fecha asiento bookEntried: fecha asiento
isVatDeductible: impuesto deducible isVatDeductible: impuesto deducible
withholdingSageFk: código de retención withholdingSageFk: código de retención
expenceFkDeductible: gasto deducible expenseFkDeductible: gasto deducible
editorFk: editor editorFk: editor

View File

@ -4,7 +4,7 @@ columns:
invoiceInFk: invoice in invoiceInFk: invoice in
taxCodeFk: tax taxCodeFk: tax
taxableBase: taxable base taxableBase: taxable base
expenceFk: expence expenseFk: expense
foreignValue: foreign amount foreignValue: foreign amount
taxTypeSageFk: tax type taxTypeSageFk: tax type
transactionTypeSageFk: transaction type transactionTypeSageFk: transaction type

View File

@ -4,7 +4,7 @@ columns:
invoiceInFk: factura recibida invoiceInFk: factura recibida
taxCodeFk: código IVA taxCodeFk: código IVA
taxableBase: base imponible taxableBase: base imponible
expenceFk: código gasto expenseFk: código gasto
foreignValue: importe divisa foreignValue: importe divisa
taxTypeSageFk: código impuesto taxTypeSageFk: código impuesto
transactionTypeSageFk: código transacción transactionTypeSageFk: código transacción

View File

@ -146,7 +146,7 @@ module.exports = Self => {
ii.docFk AS dmsFk, ii.docFk AS dmsFk,
dm.file, dm.file,
ii.supplierFk, ii.supplierFk,
ii.expenceFkDeductible deductibleExpenseFk, ii.expenseFkDeductible deductibleExpenseFk,
s.name AS supplierName, s.name AS supplierName,
s.account, s.account,
SUM(iid.amount) AS amount, SUM(iid.amount) AS amount,

View File

@ -29,15 +29,18 @@ module.exports = Self => {
SELECT iit.*, SELECT iit.*,
SUM(iidd.amount) totalDueDay SUM(iidd.amount) totalDueDay
FROM vn.invoiceIn ii FROM vn.invoiceIn ii
LEFT JOIN (SELECT SUM(iit.taxableBase) totalTaxableBase, LEFT JOIN (
CAST(SUM(iit.taxableBase * (1 + (ti.PorcentajeIva / 100))) AS DECIMAL(10,2)) totalVat SELECT SUM(iit.taxableBase) totalTaxableBase,
CAST(
SUM(IFNULL(iit.taxableBase * (1 + (ti.PorcentajeIva / 100)), iit.taxableBase))
AS DECIMAL(10, 2)
) totalVat
FROM vn.invoiceInTax iit FROM vn.invoiceInTax iit
LEFT JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk LEFT JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
WHERE iit.invoiceInFk = ?) iit ON TRUE WHERE iit.invoiceInFk = ?
) iit ON TRUE
LEFT JOIN vn.invoiceInDueDay iidd ON iidd.invoiceInFk = ii.id LEFT JOIN vn.invoiceInDueDay iidd ON iidd.invoiceInFk = ii.id
WHERE WHERE ii.id = ?`, [id, id]);
ii.id = ?`, [id, id]);
return result; return result;
}; };
}; };

View File

@ -112,7 +112,7 @@ module.exports = Self => {
{ {
relation: 'taxTypeSage', relation: 'taxTypeSage',
scope: { scope: {
fields: ['vat'] fields: ['vat', 'rate']
} }
}] }]
} }

View File

@ -19,10 +19,7 @@
"type": "number" "type": "number"
}, },
"expenseFk": { "expenseFk": {
"type": "number", "type": "number"
"mysql": {
"columnName": "expenceFk"
}
}, },
"created": { "created": {
"type": "date" "type": "date"

View File

@ -51,7 +51,7 @@
"deductibleExpenseFk": { "deductibleExpenseFk": {
"type": "number", "type": "number",
"mysql": { "mysql": {
"columnName": "expenceFkDeductible" "columnName": "expenseFkDeductible"
} }
} }
}, },

View File

@ -3,7 +3,7 @@
"base": "VnModel", "base": "VnModel",
"options": { "options": {
"mysql": { "mysql": {
"table": "expence" "table": "expense"
} }
}, },
"properties": { "properties": {

View File

@ -117,10 +117,7 @@
"description": "The item family" "description": "The item family"
}, },
"expenseFk": { "expenseFk": {
"type": "number", "type": "number"
"mysql": {
"columnName": "expenceFk"
}
}, },
"minPrice": { "minPrice": {
"type": "number" "type": "number"
@ -131,9 +128,6 @@
"nonRecycledPlastic": { "nonRecycledPlastic": {
"type": "number" "type": "number"
}, },
"minQuantity": {
"type": "number"
},
"packingOut": { "packingOut": {
"type": "number" "type": "number"
}, },

View File

@ -105,7 +105,7 @@
url="Expenses" url="Expenses"
label="Expense" label="Expense"
ng-model="$ctrl.item.expenseFk" ng-model="$ctrl.item.expenseFk"
vn-name="expence" vn-name="expense"
initial-data="$ctrl.item.expense"> initial-data="$ctrl.item.expense">
</vn-autocomplete> </vn-autocomplete>
</vn-horizontal> </vn-horizontal>

View File

@ -151,7 +151,7 @@ describe('SalesMonitor salesFilter()', () => {
const result = await models.SalesMonitor.salesFilter(ctx, filter, options); const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
const firstRow = result[0]; const firstRow = result[0];
expect(result.length).toEqual(15); expect(result.length).toEqual(12);
expect(firstRow.alertLevel).not.toEqual(0); expect(firstRow.alertLevel).not.toEqual(0);
await tx.rollback(); await tx.rollback();

View File

@ -139,6 +139,8 @@ module.exports = Self => {
filter = mergeFilters(filter, {where}); filter = mergeFilters(filter, {where});
const stmts = []; const stmts = [];
let stmt; let stmt;
stmts.push(`SET @_optimizer_search_depth = @@optimizer_search_depth`);
stmts.push(`SET SESSION optimizer_search_depth = 0`);
stmt = new ParameterizedSQL(` stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.filter CREATE OR REPLACE TEMPORARY TABLE tmp.filter
@ -195,6 +197,7 @@ module.exports = Self => {
stmt.merge(`GROUP BY id`); stmt.merge(`GROUP BY id`);
stmt.merge(conn.makePagination(filter)); stmt.merge(conn.makePagination(filter));
stmts.push(stmt); stmts.push(stmt);
stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`);
stmt = new ParameterizedSQL(`SELECT * FROM tmp.filter`); stmt = new ParameterizedSQL(`SELECT * FROM tmp.filter`);
stmt.merge(conn.makeOrderBy(filter.order)); stmt.merge(conn.makeOrderBy(filter.order));

View File

@ -54,7 +54,7 @@ module.exports = Self => {
dmsFk: firstDms.id, dmsFk: firstDms.id,
}, myOptions); }, myOptions);
const expence = await models.AgencyTermConfig.findOne(null, myOptions); const expense = await models.AgencyTermConfig.findOne(null, myOptions);
const [taxTypeSage] = await Self.rawSql(` const [taxTypeSage] = await Self.rawSql(`
SELECT IFNULL(s.taxTypeSageFk, CodigoIva) value SELECT IFNULL(s.taxTypeSageFk, CodigoIva) value
@ -78,7 +78,7 @@ module.exports = Self => {
await models.InvoiceInTax.create({ await models.InvoiceInTax.create({
invoiceInFk: newInvoiceIn.id, invoiceInFk: newInvoiceIn.id,
taxableBase: firstRow.totalPrice, taxableBase: firstRow.totalPrice,
expenseFk: expence.expenceFk, expenseFk: expense.expenseFk,
taxTypeSageFk: taxTypeSage.value, taxTypeSageFk: taxTypeSage.value,
transactionTypeSageFk: transactionTypeSage.value transactionTypeSageFk: transactionTypeSage.value
}, myOptions); }, myOptions);

View File

@ -105,7 +105,7 @@ module.exports = Self => {
} }
}); });
filter = mergeFilters(ctx.args.filter, {where}); filter = mergeFilters(filter, {where});
let stmts = []; let stmts = [];
let stmt; let stmt;
@ -129,9 +129,11 @@ module.exports = Self => {
r.description, r.description,
am.name agencyName, am.name agencyName,
u.name AS workerUserName, u.name AS workerUserName,
v.numberPlate AS vehiclePlateNumber v.numberPlate AS vehiclePlateNumber,
Date_format(r.time, '%H:%i') hour
FROM route r FROM route r
LEFT JOIN agencyMode am ON am.id = r.agencyModeFk LEFT JOIN agencyMode am ON am.id = r.agencyModeFk
LEFT JOIN agency a ON a.id = am.agencyFk
LEFT JOIN vehicle v ON v.id = r.vehicleFk LEFT JOIN vehicle v ON v.id = r.vehicleFk
LEFT JOIN worker w ON w.id = r.workerFk LEFT JOIN worker w ON w.id = r.workerFk
LEFT JOIN account.user u ON u.id = w.id` LEFT JOIN account.user u ON u.id = w.id`

View File

@ -0,0 +1,65 @@
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
module.exports = Self => {
Self.remoteMethodCtx('getByWorker', {
description: 'Return the routes by worker',
accessType: 'READ',
returns: {
type: ['object'],
root: true
},
http: {
path: `/getByWorker`,
verb: 'GET'
}
});
Self.getByWorker = async ctx => {
const models = Self.app.models;
const userId = ctx.req.accessToken.userId;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const canViewAll = await models.ACL.checkAccessAcl(ctx, 'Route', 'canViewAllRoute', 'READ');
let filterGrant = {};
if (canViewAll) {
const userConfig = await models.UserConfig.getUserConfig(ctx, myOptions);
filterGrant = {
where: {'a.warehouseFk': userConfig.warehouseFk}
};
} else {
filterGrant = {
where: {'r.workerFk': userId}
};
}
const currentDate = Date.vnNew();
currentDate.setHours(0, 0, 0, 0);
const nextDay = Date.vnNew();
nextDay.setDate(currentDate.getDate() + 1);
const filter = {
where: {
and: [
{
or: [
{'r.created': currentDate},
{'r.created': nextDay}
]
}
]
},
order: [
'r.created ASC',
'r.time ASC',
'am.name ASC'
]
};
const result = await Self.filter(ctx, mergeFilters(filter, filterGrant));
return result;
};
};

View File

@ -1,7 +1,7 @@
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('getDeliveryPoint', { Self.remoteMethod('getDeliveryPoint', {
description: 'get the deliveryPoint address', description: 'get the deliveryPoint address',
accessType: 'WRITE', accessType: 'READ',
accepts: { accepts: {
arg: 'vehicleId', arg: 'vehicleId',
type: 'number', type: 'number',

View File

@ -1,7 +1,7 @@
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('guessPriority', { Self.remoteMethodCtx('guessPriority', {
description: 'Changes automatically the priority of the tickets in a route', description: 'Changes automatically the priority of the tickets in a route',
accessType: 'READ', accessType: 'WRITE',
accepts: [{ accepts: [{
arg: 'id', arg: 'id',
type: 'number', type: 'number',
@ -15,7 +15,7 @@ module.exports = Self => {
}, },
http: { http: {
path: `/:id/guessPriority`, path: `/:id/guessPriority`,
verb: 'GET' verb: 'PATCH'
} }
}); });

View File

@ -3,7 +3,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('insertTicket', { Self.remoteMethod('insertTicket', {
description: 'Check if the ticket can be insert into the route and insert it', description: 'Check if the ticket can be insert into the route and insert it',
accessType: 'READ', accessType: 'WRITE',
accepts: [{ accepts: [{
arg: 'routeId', arg: 'routeId',
type: 'number', type: 'number',

View File

@ -0,0 +1,36 @@
const app = require('vn-loopback/server/server');
const LoopBackContext = require('loopback-context');
describe('route getByWorker()', () => {
const userId = 56;
const activeCtx = {
accessToken: {userId: userId},
http: {
req: {
headers: {origin: 'http://localhost'}
}
}
};
const ctx = {req: activeCtx};
beforeAll(() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
});
});
it('should return routes assigned to the worker', async() => {
const result = await app.models.Route.getByWorker(ctx);
expect(result.every(route => route.workerFk === userId)).toBe(true);
});
it('should return all routes if user has canViewAllRoute permission', async() => {
// Simular que el usuario tiene permiso para ver todas las rutas
spyOn(app.models.ACL, 'checkAccessAcl').and.returnValue(Promise.resolve(true));
const result = await app.models.Route.getByWorker(ctx);
expect(result.some(route => route.workerFk != userId)).toBe(true);
});
});

View File

@ -7,7 +7,7 @@
} }
}, },
"properties": { "properties": {
"expenceFk": { "expenseFk": {
"type": "string", "type": "string",
"id": true "id": true
}, },

View File

@ -17,6 +17,7 @@ module.exports = Self => {
require('../methods/route/cmr')(Self); require('../methods/route/cmr')(Self);
require('../methods/route/getExternalCmrs')(Self); require('../methods/route/getExternalCmrs')(Self);
require('../methods/route/downloadCmrsZip')(Self); require('../methods/route/downloadCmrsZip')(Self);
require('../methods/route/getByWorker')(Self);
Self.validate('kmStart', validateDistance, { Self.validate('kmStart', validateDistance, {
message: 'Distance must be lesser than 1000' message: 'Distance must be lesser than 1000'
@ -31,5 +32,5 @@ module.exports = Self => {
const routeMaxKm = 1000; const routeMaxKm = 1000;
if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd)
err(); err();
}; }
}; };

View File

@ -120,7 +120,7 @@ class Controller extends Section {
guessPriority() { guessPriority() {
let query = `Routes/${this.$params.id}/guessPriority/`; let query = `Routes/${this.$params.id}/guessPriority/`;
this.$http.get(query).then(() => { this.$http.patch(query).then(() => {
this.vnApp.showSuccess(this.$t('Order changed')); this.vnApp.showSuccess(this.$t('Order changed'));
this.$.model.refresh(); this.$.model.refresh();
}); });

View File

@ -209,22 +209,6 @@ describe('Route', () => {
}); });
}); });
describe('guessPriority()', () => {
it('should perform a GET query then call both refresh and showSuccess methods', () => {
jest.spyOn(controller.$.model, 'refresh');
jest.spyOn(controller.vnApp, 'showSuccess');
controller.$params = {id: 99};
const url = `Routes/${controller.$params.id}/guessPriority/`;
$httpBackend.expectGET(url).respond('ok');
controller.guessPriority();
$httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Order changed');
expect(controller.$.model.refresh).toHaveBeenCalledWith();
});
});
describe('onDrop()', () => { describe('onDrop()', () => {
it('should call the insert method when dragging a ticket number', () => { it('should call the insert method when dragging a ticket number', () => {
jest.spyOn(controller, 'insert'); jest.spyOn(controller, 'insert');

View File

@ -1,6 +1,7 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('deleteExpeditions', { Self.remoteMethodCtx('deleteExpeditions', {
description: 'Delete the selected expeditions', description: 'Delete the selected expeditions',
accessType: 'WRITE', accessType: 'WRITE',
accepts: [{ accepts: [{
@ -9,44 +10,59 @@ module.exports = Self => {
required: true, required: true,
description: 'The expeditions ids to delete' description: 'The expeditions ids to delete'
}], }],
returns: {
type: ['object'],
root: true
},
http: { http: {
path: `/deleteExpeditions`, path: `/deleteExpeditions`,
verb: 'POST' verb: 'POST'
},
returns: {
type: ['object'],
root: true
} }
}); });
Self.deleteExpeditions = async(expeditionIds, options) => { Self.deleteExpeditions = async(ctx, expeditionIds) => {
const models = Self.app.models; const models = Self.app.models;
const myOptions = {}; const $t = ctx.req.__;
let tx; const notDeletedExpeditions = [];
const deletedExpeditions = [];
if (typeof options == 'object')
Object.assign(myOptions, options);
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
}
try {
const promises = [];
for (let expeditionId of expeditionIds) { for (let expeditionId of expeditionIds) {
const deletedExpedition = models.Expedition.destroyById(expeditionId, myOptions); const filter = {
promises.push(deletedExpedition); fields: [],
where: {
id: expeditionId
},
include: [
{
relation: 'agencyMode',
scope: {
fields: ['code'],
}
}
]
};
const expedition = await models.Expedition.findOne(filter);
const {code} = expedition.agencyMode();
if (code && code.toLowerCase().substring(0, 10) == 'viaexpress') {
const isDeleted = await models.ViaexpressConfig.deleteExpedition(expeditionId);
if (isDeleted === 'true') {
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
deletedExpeditions.push(deletedExpedition);
} else notDeletedExpeditions.push(expeditionId);
} else {
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
deletedExpeditions.push(deletedExpedition);
}
} }
const deletedExpeditions = await Promise.all(promises); if (notDeletedExpeditions.length) {
throw new UserError(
if (tx) await tx.commit(); $t(`It was not able to remove the next expeditions:`, {expeditions: notDeletedExpeditions.join()})
);
}
return deletedExpeditions; return deletedExpeditions;
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
}; };
}; };

View File

@ -2,17 +2,16 @@ const models = require('vn-loopback/server/server').models;
const LoopBackContext = require('loopback-context'); const LoopBackContext = require('loopback-context');
describe('ticket deleteExpeditions()', () => { describe('ticket deleteExpeditions()', () => {
let ctx;
beforeAll(async() => { beforeAll(async() => {
const activeCtx = { ctx = {
accessToken: {userId: 9}, accessToken: {userId: 9},
http: {
req: { req: {
headers: {origin: 'http://localhost'} headers: {origin: 'http://localhost'}
} }
}
}; };
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx active: ctx
}); });
}); });
@ -23,7 +22,7 @@ describe('ticket deleteExpeditions()', () => {
const options = {transaction: tx}; const options = {transaction: tx};
const expeditionIds = [12, 13]; const expeditionIds = [12, 13];
const result = await models.Expedition.deleteExpeditions(expeditionIds, options); const result = await models.Expedition.deleteExpeditions(ctx, expeditionIds, options);
expect(result.length).toEqual(2); expect(result.length).toEqual(2);

View File

@ -68,7 +68,7 @@ describe('ticket filter()', () => {
const filter = {}; const filter = {};
const result = await models.Ticket.filter(ctx, filter, options); const result = await models.Ticket.filter(ctx, filter, options);
expect(result.length).toEqual(9); expect(result.length).toEqual(6);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -9,7 +9,7 @@ describe('ticket getSalesPersonMana()', () => {
const mana = await models.Ticket.getSalesPersonMana(1, options); const mana = await models.Ticket.getSalesPersonMana(1, options);
expect(mana).toEqual(73); expect(mana).toEqual(124);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -20,6 +20,9 @@
}, },
"counter": { "counter": {
"type": "number" "type": "number"
},
"externalId": {
"type": "string"
} }
}, },
"relations": { "relations": {
@ -30,7 +33,7 @@
}, },
"agencyMode": { "agencyMode": {
"type": "belongsTo", "type": "belongsTo",
"model": "agency-mode", "model": "AgencyMode",
"foreignKey": "agencyModeFk" "foreignKey": "agencyModeFk"
}, },
"worker": { "worker": {

View File

@ -18,7 +18,7 @@
"expenseFk": { "expenseFk": {
"type": "number", "type": "number",
"mysql": { "mysql": {
"columnName": "expenceFk" "columnName": "expenseFk"
} }
} }
}, },

Some files were not shown because too many files have changed in this diff Show More