Compare commits

...

95 Commits

Author SHA1 Message Date
Guillermo Bonet 5a44b5d332 Merge branch 'test' into dev
gitea/salix/pipeline/head This commit looks good Details
2025-02-28 12:23:10 +01:00
Guillermo Bonet 156b965c24 Merge branch 'master' into test
gitea/salix/pipeline/head This commit looks good Details
2025-02-28 12:22:51 +01:00
Carlos Satorres 6dac5cc9ce Merge pull request 'fix: refs #6553 workerBusiness v3' (!3508) from 6553-workerBusinessV3 into test
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3508
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
2025-02-28 10:10:08 +00:00
Pako Natek f94a52e0e9 Merge pull request 'fix(entrySource): refs #8048 refs#8048' (!3505) from 8048-entrySource into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3505
Reviewed-by: Pablo Natek <pablone@verdnatura.es>
2025-02-28 09:55:23 +00:00
Carlos Satorres 434c3ac2f9 fix: refs #6553 workerBusiness v3
gitea/salix/pipeline/pr-test This commit looks good Details
2025-02-28 10:32:16 +01:00
Pako Natek 92e77ab604 fix(entrySource): refs #8048 refs#8048
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-28 08:28:38 +01:00
Pako Natek 054483cfdd Merge pull request '8408-disponible-por-zonas' (!3503) from 8408-disponible-por-zonas into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3503
Reviewed-by: Pablo Natek <pablone@verdnatura.es>
2025-02-28 06:56:09 +00:00
Pako Natek 1103b0b257 fix(travel): refs #8408 refs#8408
gitea/salix/pipeline/pr-dev This commit looks good Details
gitea/salix/pipeline/pr-test There was a failure building this commit Details
2025-02-28 07:27:41 +01:00
Pako Natek bfa315fc55 fix(item_getBalance): refs #8408 tickets without zone must be included
gitea/salix/pipeline/pr-test There was a failure building this commit Details
Refs: #8408
2025-02-28 07:09:34 +01:00
Juan Ferrer c050e39aae fix: refs #4409 Optimize stock_refreshAll
gitea/salix/pipeline/head This commit looks good Details
2025-02-27 19:50:54 +01:00
Juan Ferrer d680dc8da7 fix: refs #8689 Drop foreign key cache.last_buy_FK_1
gitea/salix/pipeline/head This commit looks good Details
2025-02-27 19:23:21 +01:00
Jon Elias c6bfdb2cd7 Merge pull request '#7949: Added new field in sales' (!3501) from 7949-TicketModifications into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3501
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-27 14:01:36 +00:00
Jose Antonio Tubau 2f4adab3e6 Merge pull request 'refactor: refs #8645 update route kmStart and kmEnd, and include supplierRef in agency-term filter' (!3480) from 8645-addSupplierRefToAgencyTermFilter into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3480
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2025-02-27 12:06:59 +00:00
Jose Antonio Tubau 93862fecfc Merge branch 'dev' into 8645-addSupplierRefToAgencyTermFilter
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-27 11:21:09 +00:00
Pako Natek 7b8476b42c Merge pull request '8408-disponible-por-zonas' (!3495) from 8408-disponible-por-zonas into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3495
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-27 11:03:02 +00:00
Alex Moreno 011fb3a99a Merge branch 'test' of https://gitea.verdnatura.es/verdnatura/salix into dev
gitea/salix/pipeline/head This commit looks good Details
2025-02-27 12:01:31 +01:00
Alex Moreno 7715a50724 Merge branch 'master' of https://gitea.verdnatura.es/verdnatura/salix into test
gitea/salix/pipeline/head This commit looks good Details
2025-02-27 12:01:13 +01:00
Alex Moreno a85771c1e7 fix: closure email
gitea/salix/pipeline/head This commit looks good Details
2025-02-27 12:00:59 +01:00
Jose Antonio Tubau 44dc7bbb58 Merge branch 'dev' into 8645-addSupplierRefToAgencyTermFilter
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-27 11:00:22 +00:00
Pako Natek ed054bfb3d Merge branch 'dev' into 8408-disponible-por-zonas
gitea/salix/pipeline/pr-dev This commit looks good Details
gitea/salix/pipeline/pr-test There was a failure building this commit Details
2025-02-27 09:59:14 +00:00
Pako Natek d78288b778 fix(availabled): refs #8408 refs#8408 new price diference
gitea/salix/pipeline/pr-dev This commit looks good Details
gitea/salix/pipeline/pr-test This commit looks good Details
2025-02-27 10:30:24 +01:00
Jon Elias 01b78207a3 Merge branch 'dev' into 7949-TicketModifications
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-27 09:23:53 +00:00
Jon Elias 1ad1b1ea99 refactor: refs #7949 changed property in acl
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-27 10:12:28 +01:00
Jon Elias 002a106774 feat: refs #7949 added new field in sales
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-27 09:13:23 +01:00
Guillermo Bonet 929c866c7e Merge pull request 'feat: refs #8244 Floricode api' (!3472) from 8244-floricode into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3472
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-27 08:06:35 +00:00
Guillermo Bonet 87b3abd4e2 fix: refs #8244 Path test
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-27 09:04:08 +01:00
Guillermo Bonet f4842827a6 Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-27 07:36:09 +01:00
Jose Antonio Tubau 201eca7765 Merge branch 'dev' into 8645-addSupplierRefToAgencyTermFilter
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-27 06:12:18 +00:00
Juan Ferrer c831f4ff3e fix: refs #4409 lotFk unique
gitea/salix/pipeline/head Build queued... Details
2025-02-26 12:46:15 +01:00
Pako Natek ef7ce9bbb6 Merge pull request 'feat(catalog_calculate): refs #8674 new field and modified proc' (!3500) from 8674-hotFix-Restringir-el-acceso-a-determinadas-familias into master
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3500
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-26 11:38:55 +00:00
Pako Natek b5e8bfa8af Merge pull request 'feat(catalog_calculate): refs #8674 refs#8674' (!3499) from 8674-restringir-acceso-a-familias into test
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3499
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-26 11:29:26 +00:00
Pako Natek 1b3e5a2576 feat(catalog_calculate): refs #8674 new field and modified proc
gitea/salix/pipeline/pr-master This commit looks good Details
Refs: #8674
2025-02-26 12:20:39 +01:00
Pako Natek a80614a46d feat(catalog_calculate): refs #8674 refs#8674
gitea/salix/pipeline/pr-test This commit looks good Details
2025-02-26 12:18:55 +01:00
Juan Ferrer f9452c655a fix: refs #4409 lotFk index
gitea/salix/pipeline/head Something is wrong with the build of this commit Details
2025-02-26 12:02:01 +01:00
Juan Ferrer fcaa008241 fix: refs #4409 versions fix
gitea/salix/pipeline/head This commit looks good Details
2025-02-26 11:46:46 +01:00
Juan Ferrer e150c63681 Merge pull request 'feat: refs #4409 Available by lot using CDC' (!3440) from 4409-binlog into dev
gitea/salix/pipeline/head There was a failure building this commit Details
Reviewed-on: #3440
2025-02-26 09:08:06 +00:00
Jose Antonio Tubau 491b19267f refactor: refs #8645 format SQL updates for consistency in route table
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-26 09:48:53 +01:00
Jose Antonio Tubau b8c1891c20 Merge pull request 'chore: refs #8594 add new delivery point 'Stark Tower' to fixtures' (!3483) from 8594-createTestE2eVehicleList into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3483
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
2025-02-26 08:43:57 +00:00
Juan Ferrer 64b8265675 fix: refs #4409 tLotStatus alias fix
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-26 09:36:43 +01:00
Juan Ferrer a310b3e642 Merge branch 'dev' into 4409-binlog
gitea/salix/pipeline/pr-dev Build queued... Details
2025-02-26 09:32:16 +01:00
Juan Ferrer 556a58fb11 fix: refs #4409 Requested changes from PR 3440
gitea/salix/pipeline/pr-dev Build started... Details
2025-02-26 09:31:36 +01:00
Pako Natek 903eb0bc58 Merge pull request 'feat(catalog_calculate): priceDelta.isHidden restriction' (!3497) from 8674-restringir-acceso-a-familias-segun-priceDelta into dev
gitea/salix/pipeline/head This commit looks good Details
Reviewed-on: #3497
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
2025-02-26 07:43:34 +00:00
Pako Natek aa597870a4 feat(catalog_calculate): priceDelta.isHidden restriction
gitea/salix/pipeline/pr-dev This commit looks good Details
refs#8674
2025-02-26 08:33:39 +01:00
Pako Natek 05216fde12 feat(fixtures after): refs #8408 ticket shipped update
gitea/salix/pipeline/pr-test There was a failure building this commit Details
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-26 07:47:36 +01:00
Jose Antonio Tubau 3ab44fa4d6 Merge branch 'dev' into 8594-createTestE2eVehicleList
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-26 05:01:24 +00:00
Juan Ferrer 9dca258a72 fix: refs #4409 stock_refreshAll comments merged
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 18:25:58 +01:00
Juan Ferrer 7ad97a49cb fix: refs #4409 Added ticket.isAlive, orderRow.isReserved
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 18:23:41 +01:00
Juan Ferrer 842e837ab6 fix: refs #4409 include/exclude logic clarified
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-25 14:04:46 +01:00
Juan Ferrer a4a2a3958d fix: refs #4409 stock_refreshAll added
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 12:46:21 +01:00
Pako Natek fbdb9a3e07 fix: refs #8408 afterFixtures add availabled
gitea/salix/pipeline/pr-test There was a failure building this commit Details
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 12:45:43 +01:00
Juan Ferrer b85db29828 Merge branch 'dev' into 4409-binlog
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 11:24:57 +01:00
Juan Ferrer a88f41dd4b Merge branch 'dev' into 4409-binlog
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 11:18:19 +01:00
Pako Natek 2e3d39ecf7 Merge branch 'dev' into 8408-disponible-por-zonas
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
gitea/salix/pipeline/pr-test There was a failure building this commit Details
2025-02-25 09:54:59 +00:00
Juan Ferrer dc8cc6b49b fix: refs #4409 buyOut version source index fix
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 10:52:23 +01:00
Juan Ferrer 38b1e9e493 fix: refs #4409 SQL convenion fixes
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-25 10:49:58 +01:00
Pako Natek 722ce62d41 Merge branch 'dev' into 8408-disponible-por-zonas
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
gitea/salix/pipeline/pr-test There was a failure building this commit Details
2025-02-25 07:13:27 +01:00
Pako Natek c30fc8dc2e feat(available)!: refs #8408 new approach
gitea/salix/pipeline/pr-test There was a failure building this commit Details
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
All the procedures involved has been refactorized

BREAKING CHANGE: Refs: #8048
2025-02-25 07:04:48 +01:00
Juan Ferrer 7049933c6e fix: refs #4409 clean frozen sales and lost reserves
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-24 18:50:25 +01:00
Juan Ferrer 5e630562ce fix: refs #4409 don't cache parent ids
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-24 18:05:21 +01:00
Juan Ferrer 1c77e69ae4 fix: refs #4409 lotFk used for row identification
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-24 13:24:41 +01:00
Jose Antonio Tubau 8c8d2151d0 Merge branch 'dev' into 8594-createTestE2eVehicleList
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-24 11:13:52 +00:00
Javier Segarra 9fca88f309 Merge branch 'dev' into 8594-createTestE2eVehicleList
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-21 11:22:16 +00:00
Guillermo Bonet 76751ad584 fix: refs #8244 refs #7759 Requested changes
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-21 12:11:42 +01:00
Guillermo Bonet ea5b78394d fix: refs #8244 refs #7759 Requested changes
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-21 12:08:34 +01:00
Jose Antonio Tubau 33df87059b chore: refs #8594 add new delivery point 'Stark Tower' to fixtures
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-21 12:05:17 +01:00
Guillermo Bonet 529ddc5098 Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-21 11:15:35 +01:00
Jose Antonio Tubau 5c24a5684e refactor: refs #8645 update route kmStart and kmEnd, and include supplierRef in agency-term filter
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-21 09:51:26 +01:00
Guillermo Bonet 2eafebbc53 Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-20 12:51:24 +00:00
Juan Ferrer 6c2e0ba0c0 fix: refs #4409 tableId removed 2025-02-19 17:17:02 +01:00
Juan Ferrer dfaeafce4f fix: refs #4409 Pick procs renamed
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 14:50:15 +01:00
Juan Ferrer 04cd4b5dec fix: refs #4409 Sync proc splitted and renamed
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-19 14:46:55 +01:00
Juan Ferrer f2030492f4 fix: refs #4409 Allow buy life insert value 2025-02-19 14:16:55 +01:00
Juan Ferrer beac086117 fix: refs #4409 Definer fixed, sync code clean
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 14:13:54 +01:00
Juan Ferrer 053d90b76a fix: refs #4409 Parallel sync
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-19 14:07:02 +01:00
Guillermo Bonet 0019c37f83 feat: refs #8244 Requested changes
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 13:45:06 +01:00
Juan Ferrer 6001f416d0 fix: refs #4409 First sync working version
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 12:56:42 +01:00
Guillermo Bonet 720aff8c02 Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 11:36:37 +00:00
Guillermo Bonet 2b248e3f6c feat: refs #8244 Requested changes
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 12:36:12 +01:00
Guillermo Bonet 8185343d12 feat: refs #8244 Added tests
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-19 09:51:04 +01:00
Pako Natek 0cb3de872f fix(available_refresh): refs #8408 availabled
gitea/salix/pipeline/pr-test There was a failure building this commit Details
refs#8408
2025-02-19 08:10:01 +01:00
Juan Ferrer 72a651afa5 fix: refs #4409 vn.buyOut sequence
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 19:34:38 +01:00
Juan Ferrer bd8af6172d fix: refs #4409 Default life value
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 16:20:09 +01:00
Juan Ferrer e98cc7daf2 fix: refs #4409 First working version
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-18 15:58:38 +01:00
Guillermo Bonet 411868209e Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 12:58:10 +00:00
Guillermo Bonet cba381ce2f feat: refs #8244 Refactor
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 13:52:27 +01:00
Guillermo Bonet 96cba1f24f feat: refs #8244 Last changes
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 13:21:29 +01:00
Guillermo Bonet a8469b403c Merge branch 'dev' into 8244-floricode
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 12:11:35 +00:00
Guillermo Bonet bf1770dcc5 feat: refs #8244 Floricode api
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 13:05:57 +01:00
Juan Ferrer 6162cbe2c6 fix: refs #4409 t.isRaid
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-18 11:06:41 +01:00
Juan Ferrer e9244c8538 Merge branch 'dev' into 4409-binlog
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-18 08:33:22 +01:00
Guillermo Bonet 1b0da71c9d feat: refs #8244 Floricode api
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-17 15:03:23 +01:00
Juan Ferrer c954ebbb5d feat: refs #4409 Small code fixes
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-14 11:34:35 +01:00
Juan Ferrer a615174d62 feat: refs #4409 buyLot_refresh INSERT IGNORE fix
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-14 10:46:29 +01:00
Juan Ferrer 53059f5bb5 feat: refs #4409 buyLot and buyLot refresh fixes
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-14 10:21:02 +01:00
Juan Ferrer 3adc155b74 feat: refs #4409 buyLot and buyLot refresh refactor and fixes
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-12 07:57:31 +01:00
104 changed files with 1606 additions and 817 deletions

View File

@ -0,0 +1,59 @@
const models = require('vn-loopback/server/server').models;
describe('edi syncData()', function() {
const ediModel = models.Edi;
it('should be insert into the table', async() => {
const tx = await ediModel.beginTransaction({});
const options = {transaction: tx};
let error;
try {
await models.FloricodeConfig.create({
id: 1,
url: 'http://sample.com',
user: 'sample',
password: 'sample'
}, options);
spyOn(ediModel, 'getToken').and.returnValue(Promise.resolve('sampleToken'));
spyOn(ediModel, 'getData').and.returnValue(Promise.resolve([
{
expiry_date: '2001-01-01',
entry_date: '2001-01-01',
genus_id: 1,
latin_genus_name: 'Oasis',
change_date_time: '2001-03-15T10:30:15+01:00',
}, {
expiry_date: null,
entry_date: '2001-01-02',
genus_id: 2,
latin_genus_name: 'Ibiza',
change_date_time: '2001-02-03T18:20:42+00:00',
}
]));
await ediModel.syncData(options);
const data = await ediModel.rawSql('SELECT * FROM edi.genus', [], options);
// The table is deleted within the method itself; it will always be 2
expect(data.length).toEqual(2);
await tx.rollback();
} catch (e) {
error = e;
await tx.rollback();
}
expect(error).toBeUndefined();
});
it('should throw an error if floricode service is not configured', async function() {
let error;
try {
await ediModel.syncData();
} catch (e) {
error = e;
}
expect(error).toBeDefined();
});
});

View File

@ -0,0 +1,93 @@
const UserError = require('vn-loopback/util/user-error');
const fs = require('fs-extra');
const fastCsv = require("fast-csv");
const axios = require('axios');
const path = require('path');
const { pipeline } = require('stream/promises');
module.exports = Self => {
Self.remoteMethod('syncData', {
description: 'Sync schema data from external provider',
accessType: 'WRITE',
returns: {
type: 'object',
root: true
},
http: {
path: `/syncData`,
verb: 'POST'
}
});
Self.syncData = async options => {
const models = Self.app.models;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
let tx, ws;
try {
const floricodeConfig = await models.FloricodeConfig.findOne({}, myOptions);
if (!floricodeConfig) throw new UserError(`Floricode service is not configured`);
const tables = await models.TableMultiConfig.find({}, myOptions);
if (!tables?.length) throw new UserError(`No tables to sync`);
const token = await Self.getToken(floricodeConfig);
for (const table of tables) {
const data = await Self.getData(floricodeConfig.url, table.method, token);
if (!data) continue;
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
}
await Self.rawSql(`DELETE FROM edi.??`, [table.toTable], myOptions);
ws = fs.createWriteStream(path.join(__dirname, `/${table.toTable}.csv`));
await pipeline(fastCsv.write(data, { delimiter: ';' }), ws);
const templatePath = path.join(__dirname, `./syncSql/${table.toTable}.sql`);
const sqlTemplate = await fs.readFile(templatePath, 'utf8');
await Self.rawSql(sqlTemplate, [ws.path], myOptions);
await fs.remove(ws.path);
await table.updateAttribute('updated', Date.vnNew(), myOptions);
if (tx) {
await tx.commit();
delete myOptions.transaction;
}
}
} catch (e) {
if (tx) await tx.rollback();
if (await fs.pathExists(ws?.path))
await fs.remove(ws?.path);
throw e;
}
};
Self.getToken = async function ({ url, user, password}) {
return (await axios.post(`${url}/oauth/token`, {
grant_type: 'client_credentials',
client_id: user,
client_secret: password
}, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}
)).data.access_token;
};
Self.getData = async function (url, method, token) {
let data = [];
let count = 0;
const maxCount = (await Self.get(`${url}/v2/${method}?$count=true`, token))["@odata.count"];
while (count < maxCount) {
const response = await Self.get(`${url}/v2/${method}?$skip=${count}`, token)
data.push(...response.value);
count += response.value.length;
}
return data;
};
Self.get = async function get(url, token) {
return (await axios.get(url, { headers: { Authorization: `Bearer ${token}` } })).data;
};
};

View File

@ -0,0 +1,14 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`bucket`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11)
SET bucket_id = @col3,
bucket_type_id = @col5,
description = @col6,
x_size = @col7,
y_size = @col8,
z_size = @col9,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col11, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,10 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`bucket_type`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5)
SET bucket_type_id = @col3,
description = @col4,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col5, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,11 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`feature`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6)
SET item_id = @col3,
feature_type_id = @col4,
feature_value = @col5,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col6, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,10 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`genus`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5)
SET genus_id = @col3,
latin_genus_name = @col4,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col5, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,14 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`item`
CHARACTER SET ascii
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11)
SET id = @col3,
product_name = @col5,
name = @col6,
plant_id = @col8,
group_id = @col10,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col11, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,12 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`item_feature`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6, @col7)
SET item_id = @col3,
feature = @col4,
regulation_type = @col5,
presentation_order = @col6,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col7, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,10 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`item_group`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5)
SET group_code = @col3,
dutch_group_description = @col4,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col5, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,11 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`plant`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8)
SET plant_id = @col4,
genus_id = @col5,
specie_id = @col6,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col8, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,11 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`specie`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6)
SET specie_id = @col3,
genus_id = @col4,
latin_species_name = @col5,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col6, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,11 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`supplier`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
(@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12, @col13, @col14, @col15, @col16, @col17, @col18, @col19, @col20, @col21)
SET GLNAddressCode = @col3,
supplier_id = @col9,
company_name = @col4,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col17, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,10 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`type`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6)
SET type_id = @col3,
type_group_id = @col4,
description = @col5,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col6, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -0,0 +1,10 @@
LOAD DATA LOCAL INFILE ?
INTO TABLE `edi`.`value`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6)
SET type_id = @col3,
type_value = @col4,
type_description = @col5,
entry_date = STR_TO_DATE(@col2, '%Y-%m-%d'),
expiry_date = STR_TO_DATE(@col1, '%Y-%m-%d'),
change_date_time = STR_TO_DATE(REGEXP_REPLACE(@col6, '\\+.*$', ''), '%Y-%m-%dT%H:%i:%s')

View File

@ -70,6 +70,9 @@
"Expedition_PrintOut": {
"dataSource": "vn"
},
"FloricodeConfig": {
"dataSource": "vn"
},
"Image": {
"dataSource": "vn"
},
@ -154,6 +157,9 @@
"SaySimpleConfig": {
"dataSource": "vn"
},
"TableMultiConfig": {
"dataSource": "vn"
},
"TempContainer": {
"dataSource": "tempStorage"
},

View File

@ -1,3 +1,4 @@
module.exports = Self => {
require('../methods/edi/updateData')(Self);
require('../methods/edi/syncData')(Self);
};

View File

@ -0,0 +1,28 @@
{
"name": "FloricodeConfig",
"base": "VnModel",
"options": {
"mysql": {
"table": "edi.floricodeConfig"
}
},
"properties": {
"id": {
"type": "number",
"id": true,
"required": true
},
"url": {
"type": "string",
"required": true
},
"user": {
"type": "string",
"required": false
},
"password": {
"type": "string",
"required": false
}
}
}

View File

@ -0,0 +1,24 @@
{
"name": "TableMultiConfig",
"base": "VnModel",
"options": {
"mysql": {
"table": "edi.tableMultiConfig"
}
},
"properties": {
"id": {
"type": "number",
"required": true
},
"toTable": {
"type": "string"
},
"method": {
"type": "string"
},
"updated": {
"type": "date"
}
}
}

View File

@ -16,8 +16,8 @@ INSERT INTO vn.entryConfig (defaultEntry, mailToNotify, inventorySupplierFk, max
*/
-- XXX: eti
INSERT INTO vn.travel (id,shipped,landed,warehouseInFk,warehouseOutFk,`ref`,m3,kg,cargoSupplierFk)
VALUES (9,'2022-05-20','2022-05-20',13,4,'nine travel',69.0,600,1);
INSERT INTO vn.travel (id,shipped,landed,availabled,warehouseInFk,warehouseOutFk,`ref`,m3,kg,cargoSupplierFk)
VALUES (9,'2022-05-20','2022-05-20','2022-05-20',13,4,'nine travel',69.0,600,1);
/* #5483
INSERT INTO vn.entry (id, supplierFk, dated, invoiceNumber, evaNotes, travelFk, companyFk)
VALUES
@ -278,6 +278,15 @@ INSERT INTO `hedera`.`tpvConfig` (currency, terminal, transactionType, maxAmount
INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk)
VALUES (1, 442);
/* UPDATE vn.ticket t
JOIN vn.zone z ON z.id = t.zoneFk
SET t.shipped = DATE(t.shipped) +
INTERVAL HOUR(z.hour) HOUR +
INTERVAL MINUTE(z.hour) MINUTE;
*/
UPDATE vn.travel
SET availabled = landed
WHERE availabled IS NULL;
-- XXX
SET foreign_key_checks = 1;

View File

@ -854,7 +854,8 @@ INSERT INTO `vn`.`ticketTracking`(`ticketFk`, `stateFk`, `userFk`, `created`)
INSERT INTO `vn`.`deliveryPoint` (`id`, `name`, `ubication`)
VALUES
(1, 'Gotham','1007 Mountain Drive, Gotham');
(1, 'Gotham','1007 Mountain Drive, Gotham'),
(6, 'Stark Tower','200 Park Avenue, Nueva York');
INSERT INTO `vn`.`vehicle`(`id`, `numberPlate`, `tradeMark`, `model`, `companyFk`, `warehouseFk`, `description`, `m3`, `isActive`, `deliveryPointFk`, `chassis`, `leasing`, `supplierFk`, `fuelTypeFk`, `bankPolicyFk`)
VALUES
@ -1536,20 +1537,20 @@ INSERT INTO `vn`.`awb` (id, code, package, weight, created, amount, transitoryFk
(9, '99610289193', 302, 2972, util.VN_CURDATE(), 3871, 442, 1),
(10, '07546500856', 185, 2364, util.VN_CURDATE(), 5321, 442, 1);
INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`,`ref`, `totalEntries`, `cargoSupplierFk`, `awbFK`, `isRaid`, `daysInForward`)
VALUES (1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1, FALSE, NULL),
(2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150.00, 2000, 'second travel', 2, 2, 2, FALSE, NULL),
(3, util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3, FALSE, NULL),
(4, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4, FALSE, NULL),
(5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5, FALSE, NULL),
(6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6, FALSE,NULL),
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7, TRUE, 2),
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10, FALSE, NULL),
(10, DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), 5, 1, 1, 50.00, 500, 'nineth travel', 1, 2, 10, TRUE, 2),
(11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(13, util.VN_CURDATE() - INTERVAL 1 MONTH - INTERVAL 1 DAY, util.VN_CURDATE() - INTERVAL 1 MONTH, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(14, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL);
INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `availabled`,`warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`,`ref`, `totalEntries`, `cargoSupplierFk`, `awbFK`, `isRaid`, `daysInForward`)
VALUES (1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1, FALSE, NULL),
(2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150.00, 2000, 'second travel', 2, 2, 2, FALSE, NULL),
(3, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3, FALSE, NULL),
(4, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4, FALSE, NULL),
(5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5, FALSE, NULL),
(6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6, FALSE,NULL),
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7, TRUE, 2),
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10, FALSE, NULL),
(10, DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), 5, 1, 1, 50.00, 500, 'nineth travel', 1, 2, 10, TRUE, 2),
(11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(13, util.VN_CURDATE() - INTERVAL 1 MONTH - INTERVAL 1 DAY, util.VN_CURDATE() - INTERVAL 1 MONTH, util.VN_CURDATE() - INTERVAL 1 MONTH, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
(14, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE() + INTERVAL 1 DAY,util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL);
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `evaNotes`, `typeFk`)
VALUES
@ -2832,12 +2833,18 @@ INSERT INTO `bs`.`defaulter` (`clientFk`, `amount`, `created`, `defaulterSinced`
(1109, 500, util.VN_CURDATE(), util.VN_CURDATE());
UPDATE `vn`.`route`
SET `invoiceInFk`=1
WHERE `id`=1;
SET
`invoiceInFk` = 1,
`kmStart` = 0,
`kmEnd` = 0
WHERE `id` = 1;
UPDATE `vn`.`route`
SET `invoiceInFk`=2
WHERE `id`=2;
SET
`invoiceInFk` = 2,
`kmStart` = 0,
`kmEnd` = 0
WHERE `id` = 2;
INSERT INTO `bs`.`sale` (`saleFk`, `amount`, `dated`, `typeFk`, `clientFk`)
VALUES
@ -3331,6 +3338,7 @@ INSERT IGNORE INTO vn.itemType
INSERT IGNORE INTO vn.travel
SET id = 99,
shipped = CURDATE(),
availabled = CURDATE(),
landed = CURDATE(),
warehouseInFk = 999,
warehouseOutFk = 1,
@ -4147,5 +4155,8 @@ INSERT IGNORE INTO vn.vehicleType (id, name)
(3, 'cabeza tractora'),
(4, 'remolque');
INSERT INTO edi.tableMultiConfig (fileName, toTable, file, `method`, updated)
VALUES ('FG', 'genus', 'florecompc2', 'VBN/Genus', '2001-01-01');
INSERT INTO vn.addressWaste (addressFk, type)
VALUES (11, 'fault');

View File

@ -6,7 +6,15 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`available_refresh`
`vAvailabled` DATETIME
)
proc: BEGIN
DECLARE vStartDate DATE;
/**
* Calculates the availability of all items by warehouse and date
*
* @param vCalc Returns cache.cache_calc.id
* @param vRefresh Forces the calculation
* @param vWarehouse vn.warehouse.id
* @param vAvailabled Moment in time for required availability
*
*/
DECLARE vReserveDate DATETIME;
DECLARE vParams CHAR(100);
DECLARE vInventoryDate DATE;
@ -28,7 +36,7 @@ proc: BEGIN
SET vAvailabled = vDated + INTERVAL HOUR(vAvailabled) HOUR;
CALL vn.item_getStock(vWarehouse, vDated, NULL);
CALL vn.item_getStock(vWarehouse, vAvailabled, NULL);
SET vParams = CONCAT_WS('/', vWarehouse, vAvailabled);
CALL cache_calc_start (vCalc, vRefresh, 'available', vParams);
@ -38,10 +46,16 @@ proc: BEGIN
END IF;
-- Calcula algunos parámetros necesarios
SET vStartDate = TIMESTAMP(vDated, '00:00:00');
SELECT inventoried INTO vInventoryDate FROM vn.config;
SELECT DATE_SUB(vStartDate, INTERVAL MAX(life) DAY) INTO vLifeScope FROM vn.itemType;
SELECT SUBTIME(util.VN_NOW(), reserveTime) INTO vReserveDate
SELECT inventoried
INTO vInventoryDate
FROM vn.config;
SELECT DATE_SUB(vDated, INTERVAL MAX(life) DAY)
INTO vLifeScope
FROM vn.itemType;
SELECT SUBTIME(util.VN_NOW(), reserveTime)
INTO vReserveDate
FROM hedera.orderConfig;
SELECT w.id INTO vWarehouseFkInventory
@ -49,22 +63,22 @@ proc: BEGIN
WHERE w.code = 'inv';
-- Calcula el ultimo dia de vida para cada producto
DROP TEMPORARY TABLE IF EXISTS itemRange;
CREATE TEMPORARY TABLE itemRange
CREATE OR REPLACE TEMPORARY TABLE itemRange
(PRIMARY KEY (itemFk))
ENGINE = MEMORY
SELECT i.id itemFk,
util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended, it.life
SELECT i.id itemFk,
util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended,
it.life
FROM vn.item i
LEFT JOIN (
SELECT b.itemFk, MAX(t.landed) maxLanded
SELECT b.itemFk, MAX(t.availabled) maxLanded
FROM vn.buy b
JOIN vn.entry e ON b.entryFk = e.id
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.warehouse w ON w.id = t.warehouseInFk
JOIN vn.item i ON i.id = b.itemFk
JOIN vn.itemType it ON it.id = i.typeFk
WHERE t.landed BETWEEN vLifeScope AND vStartDate
WHERE t.landed BETWEEN vLifeScope AND vDated
AND t.warehouseInFk = vWarehouse
AND t.warehouseOutFk <> vWarehouseFkInventory
AND it.life
@ -72,62 +86,78 @@ proc: BEGIN
GROUP BY b.itemFk
) c ON i.id = c.itemFk
JOIN vn.itemType it ON it.id = i.typeFk
HAVING ended >= vStartDate OR life IS NULL;
HAVING ended >= vDated OR life IS NULL;
-- Calcula el ATP
-- Calcula el ATP (Available to Promise)
DELETE FROM available WHERE calc_id = vCalc;
DROP TEMPORARY TABLE IF EXISTS tmp.itemCalc;
CREATE TEMPORARY TABLE tmp.itemCalc
CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
(INDEX (itemFk,warehouseFk))
ENGINE = MEMORY
SELECT itemFk, vWarehouse warehouseFk, DATE(dated) dated, SUM(quantity) quantity
FROM (SELECT i.itemFk, i.shipped dated, i.quantity
SELECT itemFk,
vWarehouse warehouseFk,
dated,
SUM(quantity) quantity
FROM (
SELECT i.itemFk,
i.shipped dated,
i.quantity
FROM vn.itemTicketOut i
JOIN itemRange ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vStartDate
AND (ir.ended IS NULL OR i.shipped <= ir.ended)
WHERE i.shipped >= vAvailabled
AND (ir.ended IS NULL
OR i.shipped <= ir.ended)
AND i.warehouseFk = vWarehouse
UNION ALL
SELECT i.itemFk, IFNULL(i.availabled, i.landed), i.quantity
SELECT i.itemFk,
i.availabled,
i.quantity
FROM vn.itemEntryIn i
JOIN itemRange ir ON ir.itemFk = i.itemFk
LEFT JOIN edi.warehouseFloramondo wf ON wf.entryFk = i.entryFk
WHERE IFNULL(i.availabled, i.landed) >= vStartDate
AND IFNULL(i.availabled, i.landed) <= vAvailabled
AND (ir.ended IS NULL OR IFNULL(i.availabled, i.landed) <= ir.ended)
WHERE i.availabled >= vAvailabled
AND (ir.ended IS NULL
OR i.availabled <= ir.ended)
AND i.warehouseInFk = vWarehouse
AND wf.entryFk IS NULL
UNION ALL
SELECT i.itemFk, i.shipped, i.quantity
UNION ALL
SELECT i.itemFk,
i.shipped,
i.quantity
FROM vn.itemEntryOut i
JOIN itemRange ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vStartDate
AND (ir.ended IS NULL OR i.shipped <= ir.ended)
WHERE i.shipped >= vAvailabled
AND (ir.ended IS NULL
OR i.shipped <= ir.ended)
AND i.warehouseOutFk = vWarehouse
UNION ALL
SELECT r.item_id, r.shipment, -r.amount
SELECT r.item_id,
r.shipment,
-r.amount
FROM hedera.order_row r
JOIN hedera.`order` o ON o.id = r.order_id
JOIN itemRange ir ON ir.itemFk = r.item_id
WHERE r.shipment >= vStartDate
AND (ir.ended IS NULL OR r.shipment <= ir.ended)
WHERE r.shipment >= vDated
AND (ir.ended IS NULL
OR r.shipment <= ir.ended)
AND r.warehouse_id = vWarehouse
AND r.created >= vReserveDate
AND NOT o.confirmed
) t
GROUP BY itemFk, dated;
CALL vn.item_getAtp(vDated);
CALL vn.item_getAtp(vAvailabled);
INSERT INTO available (calc_id, item_id, available)
SELECT vCalc, sub.itemFk, SUM(sub.quantity)
SELECT vCalc,
sub.itemFk,
SUM(sub.quantity)
FROM (
SELECT ir.itemFk, stock quantity
SELECT ir.itemFk,
stock quantity
FROM tmp.itemList il
JOIN itemRange ir ON ir.itemFk = il.itemFk
UNION ALL
SELECT itemFk, quantity
SELECT itemFk,
quantity
FROM tmp.itemAtp
)sub
GROUP BY sub.itemFk;

View File

@ -2,7 +2,7 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`stock_refresh`(v_refresh BOOL)
proc: BEGIN
/**
* Crea o actualiza la cache con el disponible hasta el ­a de
* Crea o actualiza la cache con el disponible hasta el a de
* ayer. Esta cache es usada como base para otros procedimientos
* como el cálculo del visible o del ATP.
*
@ -36,15 +36,19 @@ proc: BEGIN
(
SELECT itemFk AS item_id, warehouseFk AS warehouse_id, quantity AS amount
FROM vn.itemTicketOut
WHERE shipped >= v_date_inv AND shipped < vCURDATE
WHERE shipped >= v_date_inv
AND shipped < vCURDATE
UNION ALL
SELECT itemFk ASitem_id, warehouseInFk AS warehouse_id, quantity AS amount
FROM vn.itemEntryIn
WHERE landed >= v_date_inv AND landed < vCURDATE AND isVirtualStock is FALSE
WHERE availabled >= v_date_inv
AND availabled < vCURDATE
AND isVirtualStock is FALSE
UNION ALL
SELECT itemFk AS item_id ,warehouseOutFk AS warehouse_id, quantity AS amount
FROM vn.itemEntryOut
WHERE shipped >= v_date_inv AND shipped < vCURDATE
WHERE shipped >= v_date_inv
AND shipped < vCURDATE
) t
GROUP BY item_id, warehouse_id HAVING amount != 0;

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `stock`.`log_clean`
ON SCHEDULE EVERY 1 DAY
STARTS '2022-01-28 09:29:18.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL log_clean$$
DELIMITER ;

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `stock`.`log_syncNoWait`
ON SCHEDULE EVERY 5 SECOND
STARTS '2017-06-27 17:15:02.000'
ON COMPLETION NOT PRESERVE
DISABLE
DO CALL log_syncNoWait$$
DELIMITER ;

View File

@ -0,0 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `stock`.`stock_clean`
ON SCHEDULE EVERY 60 SECOND
STARTS '2025-01-01 00:00:00.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL stock_clean$$
DELIMITER ;

View File

@ -0,0 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `stock`.`stock_sync`
ON SCHEDULE EVERY 5 SECOND
STARTS '2025-01-01 00:00:00.000'
ON COMPLETION PRESERVE
DISABLE
DO CALL stock_sync$$
DELIMITER ;

View File

@ -0,0 +1,91 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_refresh`(
`vTable` ENUM('lot', 'entry', 'travel'),
`vId` INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
CREATE OR REPLACE TEMPORARY TABLE tBuyAlive
ENGINE = MEMORY
SELECT
t.id travelFk,
t.landed,
t.landingHour,
t.warehouseInFk,
t.isReceived,
t.isRaid,
e.id entryFk,
b.lotFk,
b.itemFk,
b.life,
b.quantity
FROM tLotStatus ls
JOIN vn.buy b ON b.lotFk = ls.lotFk
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
WHERE ls.isIncluded;
START TRANSACTION;
-- Delete excluded/deleted/dead lots
DELETE l FROM buyLot l
JOIN tLotStatus ls USING(lotFk)
WHERE NOT ls.isIncluded;
-- Delete undead lot picks
UPDATE buyOut o
JOIN buyPick p ON p.outFk = o.outFk
JOIN tLotStatus ls ON ls.lotFk = p.lotFk
SET o.isSync = FALSE,
o.lack = o.lack + p.quantity
WHERE ls.isExcluded OR ls.isIncluded;
DELETE p FROM buyPick p
JOIN tLotStatus ls USING(lotFk)
WHERE ls.isExcluded OR ls.isIncluded;
-- Update alive outs
INSERT INTO buyLot (
lotFk,
isSync,
isPicked,
warehouseFk,
itemFk,
dated,
expired,
quantity,
available
)
SELECT
lotFk,
FALSE,
isReceived,
warehouseInFk,
itemFk,
@dated := ADDTIME(landed, IFNULL(landingHour, '00:00:00')),
@dated + INTERVAL life DAY,
quantity,
NULL
FROM tBuyAlive
ON DUPLICATE KEY UPDATE
isSync = VALUES(isSync),
isPicked = VALUES(isPicked),
warehouseFk = VALUES(warehouseFk),
itemFk = VALUES(itemFk),
dated = VALUES(dated),
expired = VALUES(expired),
quantity = VALUES(quantity),
available = VALUES(available);
COMMIT;
DROP TEMPORARY TABLE tBuyAlive;
END$$
DELIMITER ;

View File

@ -0,0 +1,64 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_requestQuantity`(
vSelf INT,
vRequested INT,
vDated DATETIME,
vOutFk INT,
OUT vSupplied INT)
BEGIN
/**
* Disassociates lot picks after the given date until the demanded quantity is
* satisfied.
*
* @param vSelf The buyLot reference
* @param vRequested The requested quantity
* @param vDate The starting date for the associated outs
* @param vOutFk The if of requesting out
* @param vSupplied The supplied quantity
*/
DECLARE vPickFk INT;
DECLARE vPickOutFk INT;
DECLARE vPickQuantity INT;
DECLARE vPickGranted INT;
DECLARE vDone BOOL;
DECLARE vPicks CURSOR FOR
SELECT p.id, o.outFk, p.quantity
FROM buyPick p
JOIN buyOut o USING(outFk)
WHERE p.lotFk = vSelf
AND (o.dated, o.outFk) > (vDated, vOutFk)
ORDER BY o.dated DESC, o.created DESC, o.outFk DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET vSupplied = 0;
OPEN vPicks;
myLoop: LOOP
SET vDone = FALSE;
FETCH vPicks INTO vPickFk, vPickOutFk, vPickQuantity;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted;
CALL buyPick_remove(vPickFk, vPickGranted, vPickQuantity);
UPDATE buyOut
SET isSync = FALSE,
lack = lack + vPickGranted
WHERE outFk = vPickOutFk;
IF vSupplied >= vRequested THEN
LEAVE myLoop;
END IF;
END LOOP;
CLOSE vPicks;
END$$
DELIMITER ;

View File

@ -1,10 +1,10 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`inbound_sync`(vSelf INT)
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_sync`(vSelf INT)
BEGIN
/**
* Associates a inbound with their possible outbounds, updating it's available.
* Associates a lot with their possible outs, updating it's available.
*
* @param vSelf The inbound identifier
* @param vSelf The lot id
*/
DECLARE vDated DATETIME;
DECLARE vExpired DATETIME;
@ -14,37 +14,37 @@ BEGIN
DECLARE vAvailable INT;
DECLARE vSupplied INT;
DECLARE vSuppliedFromRequest INT;
DECLARE vOutboundFk INT;
DECLARE vOutFk INT;
DECLARE vLack INT;
DECLARE vHasPicks BOOL;
DECLARE vDone BOOL;
DECLARE vOutbounds CURSOR FOR
SELECT id, lack, lack < quantity
FROM outbound
DECLARE vOuts CURSOR FOR
SELECT outFk, lack, lack < quantity
FROM buyOut
WHERE warehouseFk = vWarehouse
AND itemFk = vItem
AND dated >= vDated
AND (vExpired IS NULL OR dated < vExpired)
ORDER BY dated, created;
ORDER BY dated, created, outFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SELECT warehouseFk, itemFk, available, quantity, expired, dated
INTO vWarehouse, vItem, vAvailable, vQuantity, vExpired, vDated
FROM inbound
WHERE id = vSelf;
FROM buyLot
WHERE lotFk = vSelf;
IF vAvailable IS NULL THEN
SET vAvailable = vQuantity;
END IF;
OPEN vOutbounds;
OPEN vOuts;
myLoop: LOOP
SET vDone = FALSE;
FETCH vOutbounds INTO vOutboundFk, vLack, vHasPicks;
FETCH vOuts INTO vOutFk, vLack, vHasPicks;
IF vDone THEN
LEAVE myLoop;
@ -54,19 +54,19 @@ BEGIN
IF vSupplied > 0 THEN
SET vAvailable = vAvailable - vSupplied;
UPDATE outbound
UPDATE buyOut
SET lack = lack - vSupplied
WHERE id = vOutboundFk;
WHERE outFk = vOutFk;
END IF;
IF vHasPicks AND vAvailable > 0 THEN
CALL outbound_requestQuantity(vOutboundFk, vAvailable, vDated, vSuppliedFromRequest);
CALL buyOut_requestQuantity(vOutFk, vAvailable, vDated, vSelf, vSuppliedFromRequest);
SET vSupplied = vSupplied + vSuppliedFromRequest;
SET vAvailable = vAvailable - vSuppliedFromRequest;
END IF;
IF vSupplied > 0 THEN
CALL inbound_addPick(vSelf, vOutboundFk, vSupplied);
CALL buyPick_add(vSelf, vOutFk, vSupplied);
END IF;
IF vAvailable <= 0 THEN
@ -74,11 +74,11 @@ BEGIN
END IF;
END LOOP;
CLOSE vOutbounds;
CLOSE vOuts;
UPDATE inbound
UPDATE buyLot
SET isSync = TRUE,
available = vAvailable
WHERE id = vSelf;
WHERE lotFk = vSelf;
END$$
DELIMITER ;

View File

@ -0,0 +1,95 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refresh`(
`vTable` VARCHAR(255),
`vId` INT,
`vSource` VARCHAR(255))
BEGIN
/**
* This procedure contains the common code used to refresh the out lot cache.
*
* @param vTable The id source table
* @param vId The lot id
* @param vSource The lot source
* @table tLotStatus Lots to modify
* @table tLotAlive Updated/Created alive lots data
*/
DECLARE vHasLots BOOL;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
IF vTable = 'lot' THEN
SELECT COUNT(*) > 0 INTO vHasLots FROM tLotStatus;
IF NOT vHasLots THEN
INSERT INTO tLotStatus
SET lotFk = vId,
isExcluded = TRUE,
isIncluded = FALSE;
END IF;
END IF;
START TRANSACTION;
-- Delete excluded/deleted/dead outs
DELETE o FROM buyOut o
JOIN tLotStatus ls ON ls.lotFk = o.outFk
WHERE NOT ls.isIncluded;
-- Delete undead out picks
UPDATE buyLot l
JOIN buyPick p ON p.lotFk = l.lotFk
JOIN tLotStatus ls ON ls.lotFk = p.outFk
SET l.isSync = FALSE,
l.available = l.available + p.quantity
WHERE ls.isExcluded OR ls.isIncluded;
DELETE p FROM buyPick p
JOIN tLotStatus ls ON ls.lotFk = p.outFk
WHERE ls.isExcluded OR ls.isIncluded;
-- Update alive outs
INSERT INTO buyOut (
outFk,
source,
isSync,
warehouseFk,
dated,
itemFk,
quantity,
lack,
created,
isPicked
)
SELECT
lotFk,
vSource,
FALSE,
warehouseFk,
dated,
itemFk,
quantity,
quantity,
created,
isPicked
FROM tLotAlive
ON DUPLICATE KEY UPDATE
source = VALUES(source),
warehouseFk = VALUES(warehouseFk),
dated = VALUES(dated),
itemFk = VALUES(itemFk),
quantity = VALUES(quantity),
lack = VALUES(lack),
created = VALUES(created),
isPicked = VALUES(isPicked),
isSync = VALUES(isSync);
COMMIT;
END$$
DELIMITER ;

View File

@ -0,0 +1,39 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refreshBuy`(
`vTable` VARCHAR(255),
`vId` INT)
BEGIN
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT lotFk,
@isExcluded := b.quantity <= 0 isExcluded,
NOT @isExcluded AND b.isAlive isIncluded
FROM vn.buy b
JOIN vn.entry e ON e.id = b.entryFk
WHERE
(vTable = 'lot' AND b.lotFk = vId)
OR (vTable = 'entry' AND e.id = vId)
OR (vTable = 'travel' AND e.travelFk = vId);
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
ls.lotFk,
t.warehouseOutFk warehouseFk,
ADDTIME(t.shipped, IFNULL(shipmentHour, '00:00:00')) dated,
t.isDelivered isPicked,
b.itemFk,
b.quantity,
b.created
FROM tLotStatus ls
JOIN vn.buy b ON b.lotFk = ls.lotFk
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
WHERE ls.isIncluded;
CALL buyOut_refresh(vTable, vId, 'buy');
CALL buyLot_refresh(vTable, vId);
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -0,0 +1,36 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refreshOrder`(
`vTable` VARCHAR(255),
`vId` INT)
BEGIN
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT lotFk,
@isExcluded := o.confirmed OR NOT isReserved OR r.amount <= 0 isExcluded,
NOT @isExcluded isIncluded
FROM hedera.orderRow r
JOIN hedera.`order` o ON o.id = r.orderFk
WHERE
(vTable = 'lot' AND r.lotFk = vId)
OR (vTable = 'order' AND o.id = vId);
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
ls.lotFk,
r.warehouseFk,
r.shipment dated,
r.itemFk,
r.amount quantity,
r.created,
FALSE isPicked
FROM tLotStatus ls
JOIN hedera.orderRow r ON r.lotFk = ls.lotFk
JOIN hedera.`order` o ON o.id = r.orderFk
WHERE ls.isIncluded;
CALL buyOut_refresh(vTable, vId, 'orderRow');
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -0,0 +1,42 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refreshSale`(
`vTable` VARCHAR(255),
`vId` INT)
BEGIN
DECLARE vAliveDate DATE;
SELECT util.VN_CURDATE() - INTERVAL saleLife MONTH
INTO vAliveDate
FROM config LIMIT 1;
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT lotFk,
@isExcluded := s.quantity < 0 isExcluded,
NOT @isExcluded AND t.isAlive isIncluded
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
WHERE
(vTable = 'lot' AND s.lotFk = vId)
OR (vTable = 'ticket' AND t.id = vId);
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
ls.lotFk,
t.warehouseFk,
t.shipped dated,
s.itemFk,
s.quantity,
s.created,
s.isPicked
FROM tLotStatus ls
JOIN vn.sale s ON s.lotFk = ls.lotFk
JOIN vn.ticket t ON t.id = s.ticketFk
WHERE ls.isIncluded;
CALL buyOut_refresh(vTable, vId, 'sale');
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -0,0 +1,64 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_requestQuantity`(
vSelf INT,
vRequested INT,
vDated DATETIME,
vLotFk INT,
OUT vSupplied INT)
BEGIN
/**
* Disassociates out picks after the given date until the demanded quantity is
* satisfied.
*
* @param vSelf The buyOut reference
* @param vRequested The requested quantity
* @param vDate The starting date for the associated lots
* @param vLotFk The if of requesting lot
* @param vSupplied The supplied quantity
*/
DECLARE vPickFk INT;
DECLARE vPickLotFk INT;
DECLARE vPickQuantity INT;
DECLARE vPickGranted INT;
DECLARE vDone BOOL;
DECLARE vPicks CURSOR FOR
SELECT p.id, p.lotFk, p.quantity
FROM buyPick p
JOIN buyLot l USING(lotFk)
WHERE p.outFk = vSelf
AND (l.dated, p.lotFk) > (vDated, vLotFk)
ORDER BY l.dated, p.lotFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET vSupplied = 0;
OPEN vPicks;
myLoop: LOOP
SET vDone = FALSE;
FETCH vPicks INTO vPickFk, vPickLotFk, vPickQuantity;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted;
CALL buyPick_remove(vPickFk, vPickGranted, vPickQuantity);
UPDATE buyLot
SET isSync = FALSE,
available = available + vPickGranted
WHERE lotFk = vPickLotFk;
IF vSupplied >= vRequested THEN
LEAVE myLoop;
END IF;
END LOOP;
CLOSE vPicks;
END$$
DELIMITER ;

View File

@ -1,10 +1,10 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`outbound_sync`(vSelf INT)
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_sync`(vSelf INT)
BEGIN
/**
* Attaches a outbound with available inbounds.
* Attaches an out with available lots.
*
* @param vSelf The outbound reference
* @param vSelf The buyOut reference
*/
DECLARE vDated DATETIME;
DECLARE vItem INT;
@ -12,33 +12,33 @@ BEGIN
DECLARE vLack INT;
DECLARE vSupplied INT;
DECLARE vSuppliedFromRequest INT;
DECLARE vInboundFk INT;
DECLARE vLotFk INT;
DECLARE vAvailable INT;
DECLARE vHasPicks BOOL;
DECLARE vDone BOOL;
DECLARE vInbounds CURSOR FOR
SELECT id, available, available < quantity
FROM inbound
DECLARE vBuyLots CURSOR FOR
SELECT lotFk, available, available < quantity
FROM buyLot
WHERE warehouseFk = vWarehouse
AND itemFk = vItem
AND dated <= vDated
AND (expired IS NULL OR expired > vDated)
ORDER BY dated;
ORDER BY dated, lotFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SELECT warehouseFk, itemFk, dated, lack
INTO vWarehouse, vItem, vDated, vLack
FROM outbound
WHERE id = vSelf;
FROM buyOut
WHERE outFk = vSelf;
OPEN vInbounds;
OPEN vBuyLots;
myLoop: LOOP
SET vDone = FALSE;
FETCH vInbounds INTO vInboundFk, vAvailable, vHasPicks;
FETCH vBuyLots INTO vLotFk, vAvailable, vHasPicks;
IF vDone THEN
LEAVE myLoop;
@ -48,19 +48,19 @@ BEGIN
IF vSupplied > 0 THEN
SET vLack = vLack - vSupplied;
UPDATE inbound
UPDATE buyLot
SET available = available - vSupplied
WHERE id = vInboundFk;
WHERE lotFk = vLotFk;
END IF;
IF vHasPicks AND vLack > 0 THEN
CALL inbound_requestQuantity(vInboundFk, vLack, vDated, vSuppliedFromRequest);
CALL buyLot_requestQuantity(vLotFk, vLack, vDated, vSelf, vSuppliedFromRequest);
SET vSupplied = vSupplied + vSuppliedFromRequest;
SET vLack = vLack - vSuppliedFromRequest;
END IF;
IF vSupplied > 0 THEN
CALL inbound_addPick(vInboundFk, vSelf, vSupplied);
CALL buyPick_add(vLotFk, vSelf, vSupplied);
END IF;
IF vLack = 0 THEN
@ -68,11 +68,11 @@ BEGIN
END IF;
END LOOP;
CLOSE vInbounds;
CLOSE vBuyLots;
UPDATE outbound
UPDATE buyOut
SET isSync = TRUE,
lack = vLack
WHERE id = vSelf;
WHERE outFk = vSelf;
END$$
DELIMITER ;

View File

@ -0,0 +1,15 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyPick_add`(
vLotFk INT,
vOutFk INT,
vQuantity INT
)
BEGIN
INSERT INTO buyPick
SET lotFk = vLotFk,
outFk = vOutFk,
quantity = vQuantity
ON DUPLICATE KEY UPDATE
quantity = quantity + vQuantity;
END$$
DELIMITER ;

View File

@ -0,0 +1,17 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyPick_remove`(
vSelf INT,
vQuantity INT,
vTotalQuantity INT
)
BEGIN
IF vQuantity < vTotalQuantity THEN
UPDATE buyPick
SET quantity = quantity - vQuantity
WHERE id = vSelf;
ELSE
DELETE FROM buyPick
WHERE id = vSelf;
END IF;
END$$
DELIMITER ;

View File

@ -1,16 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`inbound_addPick`(
vSelf INT,
vOutboundFk INT,
vQuantity INT
)
BEGIN
INSERT INTO inboundPick
SET
inboundFk = vSelf,
outboundFk = vOutboundFk,
quantity = vQuantity
ON DUPLICATE KEY UPDATE
quantity = quantity + vQuantity;
END$$
DELIMITER ;

View File

@ -1,20 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`inbound_removePick`(
vSelf INT,
vOutboundFk INT,
vQuantity INT,
vTotalQuantity INT
)
BEGIN
IF vQuantity < vTotalQuantity THEN
UPDATE inboundPick
SET quantity = quantity - vQuantity
WHERE inboundFk = vSelf
AND outboundFk = vOutboundFk;
ELSE
DELETE FROM inboundPick
WHERE inboundFk = vSelf
AND outboundFk = vOutboundFk;
END IF;
END$$
DELIMITER ;

View File

@ -1,61 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`inbound_requestQuantity`(
vSelf INT,
vRequested INT,
vDated DATETIME,
OUT vSupplied INT)
BEGIN
/**
* Disassociates inbound picks after the given date until the
* demanded quantity is satisfied.
*
* @param vSelf The inbound reference
* @param vRequested The requested quantity
* @param vDate The starting date for the associated outbounds
* @param vSupplied The supplied quantity
*/
DECLARE vOutboundFk INT;
DECLARE vPickQuantity INT;
DECLARE vPickGranted INT;
DECLARE vDone BOOL;
DECLARE vPicks CURSOR FOR
SELECT p.outboundFk, p.quantity
FROM inboundPick p
JOIN outbound o ON o.id = p.outboundFk
WHERE p.inboundFk = vSelf
AND o.dated > vDated
ORDER BY o.dated DESC, o.created DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET vSupplied = 0;
OPEN vPicks;
myLoop: LOOP
SET vDone = FALSE;
FETCH vPicks INTO vOutboundFk, vPickQuantity;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted;
CALL inbound_removePick(vSelf, vOutboundFk, vPickGranted, vPickQuantity);
UPDATE outbound
SET isSync = FALSE,
lack = lack + vPickGranted
WHERE id = vOutboundFk;
IF vSupplied >= vRequested THEN
LEAVE myLoop;
END IF;
END LOOP;
CLOSE vPicks;
END$$
DELIMITER ;

View File

@ -1,7 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_clean`()
BEGIN
DELETE FROM inbound WHERE dated = vn.getInventoryDate();
DELETE FROM outbound WHERE dated = vn.getInventoryDate();
END$$
DELIMITER ;

View File

@ -1,19 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_delete`(vTableName VARCHAR(255), vTableId INT)
proc: BEGIN
/**
* Processes orphan transactions.
*/
IF vTableName NOT IN ('buy', 'sale', 'orderRow') THEN
LEAVE proc;
END IF;
DELETE FROM inbound
WHERE tableName = vTableName COLLATE utf8_general_ci
AND tableId = vTableId;
DELETE FROM outbound
WHERE tableName = vTableName COLLATE utf8_general_ci
AND tableId = vTableId;
END$$
DELIMITER ;

View File

@ -1,33 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_refreshAll`()
BEGIN
/**
* Recalculates the entire cache. It takes a considerable time,
* please avoid calls to this procedure from commonly used operations.
*/
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('stock.log_sync');
RESIGNAL;
END;
IF !GET_LOCK('stock.log_sync', 30) THEN
CALL util.throw('Lock timeout exceeded');
END IF;
TRUNCATE TABLE stock.`log`;
TRUNCATE TABLE stock.`inbound`;
TRUNCATE TABLE stock.`inboundPick`;
TRUNCATE TABLE stock.`outbound`;
TRUNCATE TABLE stock.`visible`;
CALL log_refreshSale(NULL, NULL);
CALL log_refreshBuy(NULL, NULL);
CALL log_refreshOrder(NULL, NULL);
UPDATE outbound SET isSync = TRUE;
CALL log_sync(TRUE);
DO RELEASE_LOCK('stock.log_sync');
END$$
DELIMITER ;

View File

@ -1,73 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_refreshBuy`(
`vTableName` VARCHAR(255),
`vTableId` INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY
SELECT b.id buyFk,
e.id entryFk,
t.id travelFk,
b.itemFk,
t.isRaid,
ADDTIME(t.shipped,
IFNULL(t.shipmentHour, '00:00:00')) shipped,
t.warehouseOutFk,
t.isDelivered,
ADDTIME(t.landed,
IFNULL(t.landingHour, '00:00:00')) landed,
t.warehouseInFk,
t.isReceived,
tp.life,
ABS(b.quantity) quantity,
b.created,
b.quantity > 0 isIn,
t.shipped < vn.getInventoryDate() lessThanInventory
FROM vn.buy b
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.item i ON i.id = b.itemFk
JOIN vn.itemType tp ON tp.id = i.typeFk
WHERE (
vTableId IS NULL
OR (vTableName = 'travel' AND t.id = vTableId)
OR (vTableName = 'entry' AND e.id = vTableId)
OR (vTableName = 'buy' AND b.id = vTableId)
)
AND t.landed >= vn.getInventoryDate()
AND b.quantity != 0;
REPLACE INTO inbound (
tableName, tableId, warehouseFk, dated,
itemFk, expired, quantity, isPicked
)
SELECT 'buy',
buyFk,
IF(isIn, warehouseInFk, warehouseOutFk),
@dated := IF(isIn, landed, shipped),
itemFk,
TIMESTAMPADD(DAY, life, @dated),
quantity,
IF(isIn, isReceived, isDelivered) AND NOT isRaid
FROM tValues
WHERE isIn OR !lessThanInventory;
REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated,
itemFk, created, quantity, isPicked
)
SELECT 'buy',
buyFk,
IF(isIn, warehouseOutFk, warehouseInFk),
IF(isIn, shipped, landed),
itemFk,
created,
quantity,
IF(isIn, isDelivered, isReceived) AND NOT isRaid
FROM tValues
WHERE !isIn OR !lessThanInventory;
DROP TEMPORARY TABLE tValues;
END$$
DELIMITER ;

View File

@ -1,47 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_refreshOrder`(
`vTableName` VARCHAR(255),
`vTableId` INT)
BEGIN
DECLARE vExpireTime INT DEFAULT 20;
DECLARE vExpired DATETIME DEFAULT TIMESTAMPADD(MINUTE, -vExpireTime, util.VN_NOW());
DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY
SELECT
r.id rowFk,
r.itemFk,
r.warehouseFk,
r.shipment shipped,
r.amount quantity,
r.created
FROM hedera.orderRow r
JOIN hedera.`order` o ON o.id = r.orderFk
WHERE (
vTableId IS NULL
OR (vTableName = 'order' AND o.id = vTableId)
OR (vTableName = 'orderRow' AND r.id = vTableId)
)
AND !o.confirmed
AND r.shipment >= vn.getInventoryDate()
AND r.created >= vExpired
AND r.amount != 0;
REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated,
itemFk, created, expired, quantity
)
SELECT 'orderRow',
rowFk,
warehouseFk,
shipped,
itemFk,
created,
TIMESTAMPADD(MINUTE, vExpireTime, created),
quantity
FROM tValues;
DROP TEMPORARY TABLE tValues;
END$$
DELIMITER ;

View File

@ -1,66 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_refreshSale`(
`vTableName` VARCHAR(255),
`vTableId` INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY
SELECT
m.id saleFk,
m.ticketFk,
m.itemFk,
t.warehouseFk,
t.shipped,
ABS(m.quantity) quantity,
m.created,
TIMESTAMPADD(DAY, tp.life, t.shipped) expired,
m.quantity < 0 isIn,
m.isPicked OR s.alertLevel > al.id isPicked
FROM vn.sale m
JOIN vn.ticket t ON t.id = m.ticketFk
JOIN vn.ticketState s ON s.ticketFk = t.id
JOIN vn.item i ON i.id = m.itemFk
JOIN vn.itemType tp ON tp.id = i.typeFk
JOIN vn.alertLevel al ON al.code = 'ON_PREPARATION'
WHERE (
vTableId IS NULL
OR (vTableName = 'ticket' AND t.id = vTableId)
OR (vTableName = 'sale' AND m.id = vTableId)
)
AND t.shipped >= vn.getInventoryDate()
AND m.quantity != 0;
REPLACE INTO inbound (
tableName, tableId, warehouseFk, dated,
itemFk, expired, quantity, isPicked
)
SELECT 'sale',
saleFk,
warehouseFk,
shipped,
itemFk,
expired,
quantity,
isPicked
FROM tValues
WHERE isIn;
REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated,
itemFk, created, quantity, isPicked
)
SELECT 'sale',
saleFk,
warehouseFk,
shipped,
itemFk,
created,
quantity,
isPicked
FROM tValues
WHERE !isIn;
DROP TEMPORARY TABLE tValues;
END$$
DELIMITER ;

View File

@ -1,123 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_sync`(vSync BOOL)
proc: BEGIN
DECLARE vDone BOOL;
DECLARE vLogId INT;
DECLARE vHasPendingSync BOOL;
DECLARE vOperation VARCHAR(255);
DECLARE vTableName VARCHAR(255);
DECLARE vTableId VARCHAR(255);
DECLARE vInboundFk INT;
DECLARE vOutboundFk INT;
DECLARE cInbound CURSOR FOR
SELECT id FROM inbound
WHERE !isSync
ORDER BY dated;
DECLARE cOutbound CURSOR FOR
SELECT id FROM outbound
WHERE !isSync
ORDER BY dated;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
-- Applies changes
opsLoop: LOOP
START TRANSACTION;
SET vDone = FALSE;
SELECT id, operation, tableName, tableId
INTO vLogId, vOperation, vTableName, vTableId
FROM `log`
ORDER BY id LIMIT 1
FOR UPDATE;
IF vDone THEN
COMMIT;
LEAVE opsLoop;
END IF;
CALL log_delete(vTableName, vTableId);
IF vOperation = 'insert' THEN
IF vTableName IN ('travel', 'entry', 'buy') THEN
CALL log_refreshBuy(vTableName, vTableId);
ELSEIF vTableName IN ('ticket', 'sale') THEN
CALL log_refreshSale(vTableName, vTableId);
ELSEIF vTableName IN ('order', 'orderRow') THEN
CALL log_refreshOrder(vTableName, vTableId);
END IF;
END IF;
DELETE FROM `log` WHERE id = vLogId;
SET vSync = TRUE;
COMMIT;
END LOOP;
IF !vSync THEN
LEAVE proc;
END IF;
-- Deletes expired outbounds
DELETE FROM outbound WHERE expired <= util.VN_NOW();
-- Attaches desync inbounds
REPEAT
OPEN cInbound;
SET vHasPendingSync = FALSE;
inboundLoop: LOOP
SET vDone = FALSE;
FETCH cInbound INTO vInboundFk;
IF vDone THEN
LEAVE inboundLoop;
END IF;
START TRANSACTION;
CALL inbound_sync(vInboundFk);
COMMIT;
SET vHasPendingSync = TRUE;
END LOOP;
CLOSE cInbound;
UNTIL !vHasPendingSync END REPEAT;
-- Attaches desync outbounds
REPEAT
OPEN cOutbound;
SET vHasPendingSync = FALSE;
outboundLoop: LOOP
SET vDone = FALSE;
FETCH cOutbound INTO vOutboundFk;
IF vDone THEN
LEAVE outboundLoop;
END IF;
START TRANSACTION;
CALL outbound_sync(vOutboundFk);
COMMIT;
SET vHasPendingSync = TRUE;
END LOOP;
CLOSE cOutbound;
UNTIL !vHasPendingSync END REPEAT;
END$$
DELIMITER ;

View File

@ -1,16 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`log_syncNoWait`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('stock.log_sync');
RESIGNAL;
END;
IF GET_LOCK('stock.log_sync', 0) THEN
CALL log_sync(FALSE);
END IF;
DO RELEASE_LOCK('stock.log_sync');
END$$
DELIMITER ;

View File

@ -1,61 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`outbound_requestQuantity`(
vSelf INT,
vRequested INT,
vDated DATETIME,
OUT vSupplied INT)
BEGIN
/**
* Disassociates outbound picks after the given date until the
* demanded quantity is satisfied.
*
* @param vSelf The outbound reference
* @param vRequested The requested quantity
* @param vDate The starting date for the associated inbounds
* @param vSupplied The supplied quantity
*/
DECLARE vInboundFk INT;
DECLARE vPickQuantity INT;
DECLARE vPickGranted INT;
DECLARE vDone BOOL;
DECLARE vPicks CURSOR FOR
SELECT p.inboundFk, p.quantity
FROM inboundPick p
JOIN inbound i ON i.id = p.inboundFk
WHERE p.outboundFk = vSelf
AND i.dated > vDated
ORDER BY i.dated DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
SET vSupplied = 0;
OPEN vPicks;
myLoop: LOOP
SET vDone = FALSE;
FETCH vPicks INTO vInboundFk, vPickQuantity;
IF vDone THEN
LEAVE myLoop;
END IF;
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted;
CALL inbound_removePick(vInboundFk, vSelf, vPickGranted, vPickQuantity);
UPDATE inbound
SET isSync = FALSE,
available = available + vPickGranted
WHERE id = vInboundFk;
IF vSupplied >= vRequested THEN
LEAVE myLoop;
END IF;
END LOOP;
CLOSE vPicks;
END$$
DELIMITER ;

View File

@ -0,0 +1,32 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`stock_clean`()
BEGIN
/**
* Cleans current time dependent cache records.
*/
DECLARE vExpired DATETIME;
DECLARE vAliveDate DATE;
-- Expired order reserves
SELECT SUBTIME(util.VN_NOW(), reserveTime)
INTO vExpired
FROM hedera.orderConfig LIMIT 1;
UPDATE hedera.order
SET isReserved = FALSE
WHERE created < vExpired
AND isReserved;
-- Frozen old sales
SELECT util.VN_CURDATE() - INTERVAL saleLife DAY
INTO vAliveDate
FROM config LIMIT 1;
UPDATE vn.ticket
SET isAlive = FALSE
WHERE shipped < vAliveDate
AND isAlive;
END$$
DELIMITER ;

View File

@ -0,0 +1,90 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`stock_refreshAll`()
BEGIN
/**
* Recalculates the entire cache. It takes a considerable time,
* please avoid calls to this procedure from commonly used operations.
*/
DECLARE vDone BOOL;
DECLARE vId INT;
DECLARE vEntries CURSOR FOR
SELECT DISTINCT e.id
FROM vn.buy b
JOIN vn.entry e ON b.entryFk = e.id
WHERE b.isAlive;
DECLARE vTickets CURSOR FOR
SELECT id FROM vn.ticket WHERE isAlive;
DECLARE vOrderRows CURSOR FOR
SELECT lotFk FROM hedera.orderRow WHERE isReserved;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('stock.stock_refreshAll');
RESIGNAL;
END;
IF NOT GET_LOCK('stock.stock_refreshAll', 30) THEN
CALL util.throw('Lock timeout exceeded');
END IF;
-- Prune cache
DELETE p FROM buyPick p JOIN buyLot l USING(lotFk);
TRUNCATE TABLE buyLot;
TRUNCATE TABLE buyOut;
-- Populate cache
OPEN vEntries;
buyLoop: LOOP
SET vDone = FALSE;
FETCH vEntries INTO vId;
IF vDone THEN
LEAVE buyLoop;
END IF;
CALL buyOut_refreshBuy('entry', vId);
END LOOP;
CLOSE vEntries;
OPEN vOrderRows;
orderLoop: LOOP
SET vDone = FALSE;
FETCH vOrderRows INTO vId;
IF vDone THEN
LEAVE orderLoop;
END IF;
CALL buyOut_refreshOrder('lot', vId);
END LOOP;
CLOSE vOrderRows;
OPEN vTickets;
saleLoop: LOOP
SET vDone = FALSE;
FETCH vTickets INTO vId;
IF vDone THEN
LEAVE saleLoop;
END IF;
CALL buyOut_refreshSale('ticket', vId);
END LOOP;
CLOSE vTickets;
-- Synchronize
UPDATE buyOut SET isSync = TRUE;
CALL stock_sync;
DO RELEASE_LOCK('stock.stock_refreshAll');
END$$
DELIMITER ;

View File

@ -0,0 +1,34 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`stock_sync`()
BEGIN
/**
* Synchronizes all out of sync items. It can be called in parallel
* since it generates a lock for each item (and warehouse) synchronization
* process, see stock_syncItem().
*/
DECLARE vDone BOOL;
DECLARE vWarehouseFk INT;
DECLARE vItemFk INT;
DECLARE vItems CURSOR FOR
SELECT itemFk, warehouseFk FROM buyLot WHERE NOT isSync
UNION
SELECT itemFk, warehouseFk FROM buyOut WHERE NOT isSync;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
OPEN vItems;
itemLoop: LOOP
SET vDone = FALSE;
FETCH vItems INTO vItemFk, vWarehouseFk;
IF vDone THEN
LEAVE itemLoop;
END IF;
CALL stock_syncItem(vItemFk, vWarehouseFk, 0);
END LOOP;
CLOSE vItems;
END$$
DELIMITER ;

View File

@ -0,0 +1,88 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`stock_syncItem`(
vItemFk INT,
vWarehouseFk INT,
vWait INT)
myProc: BEGIN
/**
* Synchronizes out of sync item. It generates a lock for each item and
* warehouse synchronization process.
*
* @param vItemFk The item id
* @param vWarehouseFk The item warehouse id
* @param vWait Maximum waiting time, see GET_LOCK()
*/
DECLARE vDone BOOL;
DECLARE vHasPendingSync BOOL;
DECLARE vLotFk INT;
DECLARE vOutFk INT;
DECLARE vLock VARCHAR(255);
DECLARE vLots CURSOR FOR
SELECT lotFk FROM buyLot
WHERE NOT isSync
AND (itemFk, warehouseFk) = (vItemFk, vWarehouseFk)
ORDER BY dated, lotFk;
DECLARE vOuts CURSOR FOR
SELECT outFk FROM buyOut
WHERE NOT isSync
AND (itemFk, warehouseFk) = (vItemFk, vWarehouseFk)
ORDER BY dated, created, outFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK(vLock);
ROLLBACK;
RESIGNAL;
END;
SET vLock = CONCAT_WS('/', 'stock.stock_syncItem', vWarehouseFk, vItemFk);
IF NOT GET_LOCK(vLock, vWait) THEN
LEAVE myProc;
END IF;
REPEAT
SET vHasPendingSync = FALSE;
OPEN vLots;
lotLoop: LOOP
SET vDone = FALSE;
FETCH vLots INTO vLotFk;
IF vDone THEN
LEAVE lotLoop;
END IF;
START TRANSACTION;
CALL buyLot_sync(vLotFk);
COMMIT;
SET vHasPendingSync = TRUE;
END LOOP;
CLOSE vLots;
OPEN vOuts;
outLoop: LOOP
SET vDone = FALSE;
FETCH vOuts INTO vOutFk;
IF vDone THEN
LEAVE outLoop;
END IF;
START TRANSACTION;
CALL buyOut_sync(vOutFk);
COMMIT;
SET vHasPendingSync = TRUE;
END LOOP;
CLOSE vOuts;
UNTIL NOT vHasPendingSync END REPEAT;
END$$
DELIMITER ;

View File

@ -1,20 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`visible_log`(
vIsPicked BOOL,
vWarehouseFk INT,
vItemFk INT,
vQuantity INT
)
proc: BEGIN
IF !vIsPicked THEN
LEAVE proc;
END IF;
INSERT INTO visible
SET itemFk = vItemFk,
warehouseFk = vWarehouseFk,
quantity = vQuantity
ON DUPLICATE KEY UPDATE
quantity = quantity + VALUES(quantity);
END$$
DELIMITER ;

View File

@ -1,22 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `stock`.`inbound_afterDelete`
AFTER DELETE ON `inbound`
FOR EACH ROW
BEGIN
UPDATE outbound o
JOIN inboundPick ou ON ou.outboundFk = o.id
SET o.lack = o.lack + ou.quantity,
o.isSync = FALSE
WHERE ou.inboundFk = OLD.id;
DELETE FROM inboundPick
WHERE inboundFk = OLD.id;
CALL visible_log(
OLD.isPicked,
OLD.warehouseFk,
OLD.itemFk,
-OLD.quantity
);
END$$
DELIMITER ;

View File

@ -1,15 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `stock`.`inbound_beforeInsert`
BEFORE INSERT ON `inbound`
FOR EACH ROW
BEGIN
SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE();
CALL visible_log(
NEW.isPicked,
NEW.warehouseFk,
NEW.itemFk,
NEW.quantity
);
END$$
DELIMITER ;

View File

@ -1,22 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `stock`.`outbound_afterDelete`
AFTER DELETE ON `outbound`
FOR EACH ROW
BEGIN
UPDATE inbound i
JOIN inboundPick ou ON ou.inboundFk = i.id
SET i.available = i.available + ou.quantity,
i.isSync = FALSE
WHERE ou.outboundFk = OLD.id;
DELETE FROM inboundPick
WHERE outboundFk = OLD.id;
CALL visible_log(
OLD.isPicked,
OLD.warehouseFk,
OLD.itemFk,
OLD.quantity
);
END$$
DELIMITER ;

View File

@ -1,16 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `stock`.`outbound_beforeInsert`
BEFORE INSERT ON `outbound`
FOR EACH ROW
BEGIN
SET NEW.lack = NEW.quantity;
SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE();
CALL visible_log(
NEW.isPicked,
NEW.warehouseFk,
NEW.itemFk,
-NEW.quantity
);
END$$
DELIMITER ;

View File

@ -0,0 +1,15 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`item_getLife`(vItemFk INT)
RETURNS INT
NOT DETERMINISTIC
BEGIN
DECLARE vLife INT;
SELECT t.life INTO vLife
FROM itemType t
JOIN item i ON i.typeFk = t.id
WHERE i.id = vItemFk;
RETURN vLife;
END$$
DELIMITER ;

View File

@ -4,7 +4,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`catalog_calculate`(
vAddressFk INT,
vAgencyModeFk INT,
vShowExpiredZones BOOLEAN)
BEGIN
BEGIN
/**
* Calcula los articulos disponibles y sus precios
*
@ -12,7 +12,7 @@ BEGIN
* @param vLanded Fecha de recepcion de mercancia
* @param vAddressFk Id del consignatario
* @param vAgencyModeFk Id de la agencia
* @return tmp.ticketCalculateItem(itemFk, available, producer,
* @return tmp.ticketCalculateItem(itemFk, available, producer,
* item, size, stems, category, inkFk, image, origin, price)
* @return tmp.ticketLot(warehouseFk, itemFk, available, buyFk)
* @return tmp.ticketComponent
@ -48,34 +48,34 @@ BEGIN
CALL catalog_componentPrepare();
CREATE OR REPLACE TEMPORARY TABLE tmp.ticketCalculateItem(
itemFk INT(11) NOT NULL,
itemFk INT(11) NOT NULL,
available INT(11),
producer VARCHAR(50),
item VARCHAR(50),
size INT(10) UNSIGNED,
stems INT(11),
category VARCHAR(3),
inkFk VARCHAR(3),
producer VARCHAR(50),
item VARCHAR(50),
size INT(10) UNSIGNED,
stems INT(11),
category VARCHAR(3),
inkFk VARCHAR(3),
image VARCHAR(50),
origin VARCHAR(3),
origin VARCHAR(3),
price DECIMAL(10,2),
priceKg DECIMAL(10,2),
`grouping` INT(10) UNSIGNED,
minQuantity INT(10) UNSIGNED,
PRIMARY KEY `itemFk` (`itemFk`)
) ENGINE = MEMORY DEFAULT CHARSET=utf8;
OPEN cTravelTree;
l: LOOP
SET vDone = FALSE;
FETCH cTravelTree INTO vZoneFk, vWarehouseFk, vShipped, vHour;
SET vAvailabled = vShipped + INTERVAL HOUR(vHour) HOUR;
IF vDone THEN
LEAVE l;
END IF;
CALL `cache`.available_refresh(vAvailableCalc, FALSE, vWarehouseFk, vAvailabled);
CALL buy_getUltimate(NULL, vWarehouseFk, vShipped);
@ -89,21 +89,39 @@ BEGIN
JOIN tmp.item i ON i.itemFk = a.item_id
JOIN item it ON it.id = i.itemFk
JOIN `zone` z ON z.id = vZoneFk
LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = a.item_id
LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = a.item_id
JOIN agencyMode am ON am.id = vAgencyModeFk
JOIN agency ag ON ag.id = am.agencyFk
JOIN itemType itt ON itt.id = it.typeFk
JOIN itemCategory itc on itc.id = itt.categoryFk
JOIN address ad ON ad.id = vAddressFk
LEFT JOIN clientItemType cit
LEFT JOIN clientItemType cit
ON cit.clientFk = ad.clientFk
AND cit.itemTypeFk = itt.id
LEFT JOIN zoneItemType zit
LEFT JOIN zoneItemType zit
ON zit.zoneFk = vZoneFk
AND zit.itemTypeFk = itt.id
LEFT JOIN agencyModeItemType ait
LEFT JOIN agencyModeItemType ait
ON ait.agencyModeFk = vAgencyModeFk
AND ait.itemTypeFk = itt.id
LEFT JOIN (
SELECT i.id
FROM item i
JOIN priceDelta pd
ON pd.itemTypeFk = i.typeFk
AND (pd.minSize IS NULL OR pd.minSize <= i.`size`)
AND (pd.maxSize IS NULL OR pd.maxSize >= i.`size`)
AND (pd.inkFk IS NULL OR pd.inkFk = i.inkFk)
AND (pd.originFk IS NULL OR pd.originFk = i.originFk)
AND (pd.producerFk IS NULL OR pd.producerFk = i.producerFk)
AND (pd.warehouseFk IS NULL OR pd.warehouseFk = vWarehouseFk)
LEFT JOIN zoneGeo zg ON zg.id = pd.zoneGeoFk
LEFT JOIN zoneGeo zg2 ON zg2.id = address_getGeo(vAddressFk)
WHERE (pd.fromDated IS NULL OR pd.fromDated <= vShipped)
AND (pd.toDated IS NULL OR pd.toDated >= vShipped)
AND (pd.zoneGeoFk IS NULL OR zg2.lft BETWEEN zg.lft AND zg.rgt)
AND pd.isHidden
GROUP BY i.id) pd ON pd.id = i.itemFk
WHERE a.calc_id = vAvailableCalc
AND a.available > 0
AND (ag.isAnyVolumeAllowed OR NOT itt.isUnconventionalSize)
@ -113,7 +131,8 @@ BEGIN
it.size <= z.itemMaxSize OR z.itemMaxSize IS NULL))
AND cit.id IS NULL
AND zit.id IS NULL
AND ait.id IS NULL;
AND ait.id IS NULL
AND pd.id IS NULL;
DROP TEMPORARY TABLE tmp.buyUltimate;

View File

@ -1,11 +1,10 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vDated DATE)
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vAvailabled DATETIME)
BEGIN
/**
* Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y
* almacén.
* Calcula el valor mínimo acumulado para cada artículo por almacén.
*
* @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0
* @param vAvailabled Starting time for calculation
* @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
* @return tmp.itemAtp(itemFk, warehouseFk, quantity)
*/
@ -17,7 +16,7 @@ BEGIN
SELECT itemFk, warehouseFk, dated, quantity
FROM tmp.itemCalc
UNION ALL
SELECT itemFk, warehouseFk, vDated, 0
SELECT itemFk, warehouseFk, vAvailabled, 0
FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
) t1
GROUP BY itemFk, warehouseFk, dated
@ -28,7 +27,7 @@ BEGIN
SET @lastQuantity := 0;
CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
(INDEX (itemFk, wareHouseFk))
(PRIMARY KEY (itemFk, wareHouseFk))
SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
FROM (
SELECT
@ -43,6 +42,10 @@ BEGIN
)sub
GROUP BY itemFk, wareHouseFk;
INSERT IGNORE INTO tmp.itemAtp(itemFk, warehouseFk, quantity)
SELECT DISTINCT ic.itemFk, ic.warehouseFk, 0
FROM tmp.itemCalc ic;
DROP TEMPORARY TABLE tItemOrdered;
END$$
DELIMITER ;

View File

@ -99,7 +99,7 @@ BEGIN
),
sales AS (
WITH itemSales AS (
SELECT DATE(t.shipped) + INTERVAL HOUR(z.`hour`) HOUR shipped,
SELECT DATE(t.shipped) + INTERVAL HOUR(IFNULL(z.`hour`,0)) HOUR shipped,
s.quantity,
st2.alertLevel,
st2.name,
@ -114,7 +114,7 @@ BEGIN
cb.claimFk
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
JOIN vn.`zone` z ON z.id = t.zoneFk
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
LEFT JOIN vn.ticketState ts ON ts.ticketFk = t.id
LEFT JOIN vn.state st ON st.code = ts.code
JOIN vn.client c ON c.id = t.clientFk

View File

@ -1,7 +1,7 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getMinacum`(
vWarehouseFk TINYINT,
vDated DATE,
vAvailabled DATETIME,
vRange INT,
vItemFk INT
)
@ -11,11 +11,12 @@ BEGIN
* especificado, en caso de NULL para todos.
*
* @param vWarehouseFk Id warehouse
* @param vDated Fecha inicio
* @param vAvailabled Fecha inicio
* @param vRange Número de días a considerar
* @param vItemFk Id de artículo
* @return tmp.itemMinacum
*/
DECLARE vDated DATE DEFAULT DATE(vAvailabled);
DECLARE vDatedTo DATETIME DEFAULT util.dayEnd(vDated + INTERVAL vRange DAY);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
@ -27,25 +28,25 @@ BEGIN
sub.warehouseFk
FROM (
SELECT s.itemFk,
DATE(t.shipped) dated,
t.shipped dated,
-s.quantity quantity,
t.warehouseFk
FROM sale s
JOIN ticket t ON t.id = s.ticketFk
WHERE t.shipped BETWEEN vDated AND vDatedTo
WHERE t.shipped BETWEEN vAvailabled AND vDatedTo
AND t.warehouseFk
AND s.quantity <> 0
AND (vItemFk IS NULL OR s.itemFk = vItemFk)
AND (vWarehouseFk IS NULL OR t.warehouseFk = vWarehouseFk)
UNION ALL
SELECT b.itemFk,
t.landed,
t.availabled,
b.quantity,
t.warehouseInFk
FROM buy b
JOIN entry e ON e.id = b.entryFk
JOIN travel t ON t.id = e.travelFk
WHERE t.landed BETWEEN vDated AND vDatedTo
WHERE t.availabled BETWEEN vAvailabled AND vDatedTo
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
AND NOT e.isExcludedFromAvailable
AND b.quantity <> 0
@ -58,7 +59,7 @@ BEGIN
FROM buy b
JOIN entry e ON e.id = b.entryFk
JOIN travel t ON t.id = e.travelFk
WHERE t.shipped BETWEEN vDated AND vDatedTo
WHERE t.shipped BETWEEN vAvailabled AND vDatedTo
AND (vWarehouseFk IS NULL OR t.warehouseOutFk = vWarehouseFk)
AND NOT e.isExcludedFromAvailable
AND b.quantity <> 0
@ -84,7 +85,7 @@ BEGIN
) sub
GROUP BY sub.itemFk, sub.warehouseFk, sub.dated;
CALL item_getAtp(vDated);
CALL item_getAtp(vAvailabled);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemMinacum
(INDEX(itemFk))

View File

@ -1,21 +1,21 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getStock`(
vWarehouseFk SMALLINT,
vDated DATE,
vAvailabled DATETIME,
vItemFk INT
)
BEGIN
/**
* Calcula el stock de un artículo de un vWarehouseFk,
* desde la fecha del inventario hasta vDated
* desde la fecha del inventario hasta el momento anterior a vAvailabled
*
* @param vWarehouse Warehouse id
* @param vDated Max date to filter
* @param vAvailabled Maximum time to filter
* @param vItemFk Item id
*
* @return tmp.itemList(itemFk, stock, visible, available)
*/
SET vDated = TIMESTAMP(vDated, '00:00:00');
CALL cache.stock_refresh(FALSE);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemList
(UNIQUE INDEX i USING HASH (itemFk))
@ -28,15 +28,15 @@ BEGIN
SELECT itemFk, quantity
FROM itemTicketOut
WHERE shipped >= util.VN_CURDATE()
AND shipped < vDated
AND shipped < vAvailabled
AND warehouseFk = vWarehouseFk
AND (vItemFk IS NULL OR itemFk = vItemFk)
UNION ALL
SELECT iei.itemFk, iei.quantity
FROM itemEntryIn iei
JOIN item i ON i.id = iei.itemFk
WHERE IFNULL(iei.availabled, iei.landed) >= util.VN_CURDATE()
AND IFNULL(iei.availabled, iei.landed) < vDated
WHERE iei.availabled >= util.VN_CURDATE()
AND iei.availabled < vAvailabled
AND iei.warehouseInFk = vWarehouseFk
AND (vItemFk IS NULL OR iei.itemFk = vItemFk)
UNION ALL
@ -44,23 +44,16 @@ BEGIN
FROM itemEntryOut ieo
JOIN item i ON i.id = ieo.itemFk
WHERE ieo.shipped >= util.VN_CURDATE()
AND ieo.shipped < vDated
AND ieo.shipped < vAvailabled
AND ieo.warehouseOutFk = vWarehouseFk
AND (vItemFk IS NULL OR ieo.itemFk = vItemFk)
UNION ALL
SELECT item_id, amount
FROM cache.stock
WHERE warehouse_id = vWarehouseFk
) sub
GROUP BY itemFk
HAVING stock;
CALL cache.stock_refresh(FALSE);
INSERT INTO tmp.itemList(itemFk, stock, visible, available)
SELECT item_id, amount, amount, amount
FROM cache.stock
WHERE warehouse_id = vWarehouseFk
AND (vItemFk IS NULL OR vItemFk = item_id)
ON DUPLICATE KEY UPDATE
stock = stock + VALUES(stock),
visible = visible + VALUES(visible),
available = available + VALUES(available);
END$$
DELIMITER ;

View File

@ -6,7 +6,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_getMovable`(
)
BEGIN
/**
* Cálcula el stock movible para los artículos de un ticket
* Cálcula el stock que se puede adelantar para los artículos de un ticket.
* vNewShipped debe ser menor que vOldShipped, en los otros casos se
* asume que siempre es posible
*
@ -25,7 +25,7 @@ BEGIN
CALL item_getMinacum(
vWarehouseFk,
vNewShipped,
DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), vNewShipped),
DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), DATE(vNewShipped)),
NULL
);

View File

@ -22,6 +22,10 @@ trig: BEGIN
SET NEW.editorFk = account.myUser_getId();
IF NEW.life IS NULL THEN
SET NEW.life = item_getLife(NEW.itemFk);
END IF;
SELECT it.workerFk INTO vBuyerFk
FROM item i
JOIN itemType it ON it.id = i.typeFk
@ -57,7 +61,7 @@ trig: BEGIN
IF NEW.groupingMode IS NULL THEN
SET NEW.groupingMode = vGroupingMode;
END IF;
-- Generics
SELECT i.genericFk INTO vGenericFk
FROM item i
@ -78,7 +82,7 @@ trig: BEGIN
END IF;
IF NEW.quantity < 0 THEN
SET NEW.isIgnored = TRUE;
SET NEW.isIgnored = TRUE;
END IF;
IF NEW.weight AND NEW.packing

View File

@ -25,6 +25,10 @@ trig:BEGIN
SET NEW.editorFk = account.myUser_getId();
IF NOT (NEW.itemFk <=> OLD.itemFk) AND NEW.life <=> OLD.life THEN
SET NEW.life = item_getLife(NEW.itemFk);
END IF;
SELECT defaultEntry INTO vDefaultEntry
FROM entryConfig;

View File

@ -17,8 +17,14 @@ BEGIN
CALL travel_throwAwb(NEW.id);
END IF;
IF NEW.availabled IS NULL THEN
SET NEW.availabled = NEW.landed;
END IF;
IF NEW.availabled < NEW.landed THEN
CALL util.throw('The travel availabled cannot be earlier than landed');
END IF;
END$$
DELIMITER ;

View File

@ -41,8 +41,14 @@ BEGIN
CALL travel_throwAwb(NEW.id);
END IF;
IF NEW.availabled IS NULL THEN
SET NEW.availabled = NEW.landed;
END IF;
IF NEW.availabled < NEW.landed THEN
CALL util.throw('The travel availabled cannot be earlier than landed');
END IF;
END$$
DELIMITER ;

View File

@ -31,7 +31,8 @@ AS SELECT `e`.`gestDocFk` AS `gestdoc_id`,
`e`.`invoiceAmount` AS `invoiceAmount`,
`w`.`code` AS `buyerCode`,
`e`.`typeFk` AS `typeFk`,
`w3`.`code` AS `observationWorkerCode`
`w3`.`code` AS `observationWorkerCode`,
`tr`.`availabled`
FROM (
(
(

View File

@ -0,0 +1 @@
DROP TABLE stock.log;

View File

@ -0,0 +1,16 @@
DROP TABLE IF EXISTS stock.inboundPick;
CREATE TABLE stock.buyPick (
id INT UNSIGNED auto_increment NOT NULL,
lotFk INT(11) NOT NULL
COMMENT 'Buy id',
outFk INT(11) NOT NULL
COMMENT 'Out id',
quantity INT UNSIGNED NOT NULL
COMMENT 'Picked quantity',
PRIMARY KEY (id),
CONSTRAINT buyPick_unique UNIQUE KEY (lotFk, outFk)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb3
COLLATE=utf8mb3_unicode_ci;

View File

@ -0,0 +1,6 @@
ALTER TABLE vn.buy
ADD life INT UNSIGNED NULL
COMMENT 'Lot life expressed in days',
ADD isAlive BOOL NOT NULL DEFAULT TRUE
COMMENT 'Whether it is alive',
ADD INDEX(isAlive);

View File

@ -0,0 +1,4 @@
ALTER TABLE hedera.orderRow
ADD isReserved BOOL NOT NULL DEFAULT TRUE
COMMENT 'Whether has an available reservation',
ADD INDEX(isReserved);

View File

@ -0,0 +1,4 @@
ALTER TABLE vn.ticket
ADD isAlive BOOL NOT NULL DEFAULT TRUE
COMMENT 'Whether it is alive',
ADD INDEX(isAlive);

View File

@ -0,0 +1,10 @@
RENAME TABLE IF EXISTS stock.inbound TO stock.buyLot;
ALTER TABLE stock.buyLot
DROP KEY source,
DROP COLUMN tableName,
CHANGE tableId lotFk int(10) unsigned NOT NULL,
CHANGE isSync isSync tinyint(4) NOT NULL AFTER lotFk,
DROP PRIMARY KEY,
DROP COLUMN id,
ADD PRIMARY KEY (lotFk);

View File

@ -0,0 +1 @@
DROP TABLE stock.visible;

View File

@ -0,0 +1,10 @@
RENAME TABLE IF EXISTS stock.outbound TO stock.buyOut;
ALTER TABLE stock.buyOut
CHANGE IF EXISTS tableName source enum('buy','sale','orderRow') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
CHANGE IF EXISTS id outFk int(10) UNSIGNED NOT NULL,
DROP INDEX IF EXISTS source,
DROP COLUMN IF EXISTS tableId,
DROP INDEX IF EXISTS expired,
DROP COLUMN IF EXISTS expired,
ADD INDEX IF NOT EXISTS (source);

View File

@ -0,0 +1,8 @@
CREATE TABLE stock.config (
id INT UNSIGNED auto_increment NOT NULL,
saleLife INT UNSIGNED NOT NULL COMMENT 'Maximum sales cache lifetime in days',
CONSTRAINT config_pk PRIMARY KEY (id)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb3
COLLATE=utf8mb3_general_ci;

View File

@ -0,0 +1,2 @@
INSERT INTO stock.config (id, saleLife)
VALUES (1, 90);

View File

@ -0,0 +1 @@
CREATE SEQUENCE IF NOT EXISTS vn.buyLot;

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.sale
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;

View File

@ -0,0 +1,2 @@
ALTER TABLE hedera.orderRow
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.buy
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.sale
ADD UNIQUE IF NOT EXISTS (lotFk);

View File

@ -0,0 +1,2 @@
ALTER TABLE hedera.orderRow
ADD UNIQUE IF NOT EXISTS (lotFk);

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.buy
ADD UNIQUE IF NOT EXISTS (lotFk);

View File

@ -0,0 +1,11 @@
CREATE TABLE `edi`.`floricodeConfig` (
`id` int(10) unsigned NOT NULL,
`url` varchar(100) NOT NULL,
`user` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `floricodeConfig_check` CHECK (`id` = 1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('Edi','syncData','WRITE','ALLOW','ROLE','system');

View File

@ -0,0 +1,65 @@
ALTER TABLE edi.tableMultiConfig
ADD `method` varchar(100) DEFAULT NULL NULL AFTER file,
DROP PRIMARY KEY,
DROP KEY to_table,
ADD id int(10) unsigned NULL FIRST;
UPDATE edi.tableMultiConfig
SET id = 1, method = 'VBN/Packaging'
WHERE id IS NULL
AND fileName='CK';
UPDATE edi.tableMultiConfig
SET id = 2, method = 'VBN/PackagingType'
WHERE id IS NULL
AND fileName='FB';
UPDATE edi.tableMultiConfig
SET id = 3, method = 'VBN/ProductFeature'
WHERE id IS NULL
AND fileName='FF';
UPDATE edi.tableMultiConfig
SET id = 4, method = 'VBN/Genus'
WHERE id IS NULL
AND fileName='FG';
UPDATE edi.tableMultiConfig
SET id = 5, method = 'VBN/Product'
WHERE id IS NULL
AND fileName='FP';
UPDATE edi.tableMultiConfig
SET id = 6, method = 'VBN/RegulatoryFeatureType'
WHERE id IS NULL
AND fileName='FY';
UPDATE edi.tableMultiConfig
SET id = 7, method = 'VBN/ProductGroup'
WHERE id IS NULL
AND fileName='FO';
UPDATE edi.tableMultiConfig
SET id = 8, method = 'VBN/Plant'
WHERE id IS NULL
AND fileName='FT';
UPDATE edi.tableMultiConfig
SET id = 9, method = 'VBN/Species'
WHERE id IS NULL
AND fileName='FS';
UPDATE edi.tableMultiConfig
SET id = 10, method = 'FEC/Company'
WHERE id IS NULL
AND fileName='CC';
UPDATE edi.tableMultiConfig
SET id = 11, method = 'VBN/FeatureType'
WHERE id IS NULL
AND fileName='FE';
UPDATE edi.tableMultiConfig
SET id = 12, method = 'VBN/FeatureValue'
WHERE id IS NULL
AND fileName='FV';

View File

@ -0,0 +1,4 @@
ALTER TABLE edi.tableMultiConfig
ADD CONSTRAINT tableMultiConfig_pk PRIMARY KEY (id),
MODIFY COLUMN id int(10) unsigned auto_increment NOT NULL,
ADD CONSTRAINT tableMultiConfig_unique UNIQUE KEY (toTable);

View File

@ -0,0 +1,3 @@
ALTER TABLE vn.priceDelta ADD IF NOT EXISTS isHidden BOOL
DEFAULT FALSE NOT NULL
COMMENT 'Hides the itemType when building de catalog recordset';

View File

@ -0,0 +1,4 @@
-- Place your SQL code here
ALTER TABLE vn.priceDelta ADD IF NOT EXISTS isHidden BOOL
DEFAULT FALSE NOT NULL
COMMENT 'Hides the itemType when building de catalog recordset';

View File

@ -0,0 +1,4 @@
-- Place your SQL code here
ALTER TABLE vn.priceDelta ADD IF NOT EXISTS isHidden BOOL
DEFAULT FALSE NOT NULL
COMMENT 'Hides the itemType when building de catalog recordset';

View File

@ -0,0 +1,3 @@
-- Place your SQL code here
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('SaleGroupDetail','find','READ','ALLOW','ROLE','employee');

View File

@ -0,0 +1,2 @@
ALTER TABLE cache.last_buy
DROP FOREIGN KEY IF EXISTS last_buy_FK_1;

View File

@ -0,0 +1,6 @@
-- Place your SQL code here
UPDATE vn.travel
SET availabled = landed
WHERE availabled IS NULL;

View File

@ -95,6 +95,7 @@ module.exports = Self => {
+ sat.packagePrice * SUM(t.packages) )
AS DECIMAL(10,2)) price,
r.invoiceInFk,
i.supplierRef,
sat.supplierFk,
s.name supplierName
FROM vn.route r
@ -103,6 +104,7 @@ module.exports = Self => {
LEFT JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.supplierAgencyTerm sat ON sat.agencyFk = a.id
LEFT JOIN vn.supplier s ON s.id = sat.supplierFk
LEFT JOIN vn.invoiceIn i ON i.id = r.invoiceInFk
WHERE r.dated > DATE_ADD(?, INTERVAL -2 MONTH) AND sat.supplierFk IS NOT NULL
GROUP BY r.id
) a`

View File

@ -167,7 +167,7 @@ module.exports = Self => {
}
smtp.send({
to: config.app.reportEmail,
to: 'administracion@verdnatura.es', // #8687
subject: '[API] Nightly ticket closure report',
html: body,
}).catch(err => console.error(err));

View File

@ -96,9 +96,17 @@ module.exports = Self => {
return sale.changedModelId;
});
const details = await models.SaleGroupDetail.find({
fields: ['saleFk', 'saleGroupFk'],
where: {saleFk: {inq: saleIds}},
}, myOptions);
for (let sale of sales) {
const problems = saleProblems.get(sale.id);
sale.claim = claimedSales.get(sale.id);
const detail = details.find(d => d.saleFk === sale.id);
sale.saleGroupFk = detail ? detail.saleGroupFk : null;
if (problems) {
for (const problem in problems)
sale[problem] = problems[problem];

View File

@ -10,7 +10,7 @@ describe('ticket getTicketProblems()', () => {
const problems = await models.Ticket.getTicketProblems(ctx, 11, options);
expect(problems[7].totalProblems).toEqual(3);
expect(problems[7].totalProblems).toEqual(2);
await tx.rollback();
} catch (e) {

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