Compare commits

..

8 Commits

Author SHA1 Message Date
Alex Moreno b660c82ffa Merge branch 'dev' into 8657-app-status-pdf
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-26 06:51:51 +00:00
Alex Moreno f2421c806a Merge branch 'dev' into 8657-app-status-pdf
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-25 06:15:56 +00:00
Alex Moreno 3ed1d2e163 Merge branch 'dev' into 8657-app-status-pdf
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-24 13:43:55 +00:00
Alex Moreno acf0f82d85 fix: refs #8657 test await printer server
gitea/salix/pipeline/pr-dev This commit looks good Details
2025-02-24 14:28:29 +01:00
Alex Moreno 186219f057 Merge branch '8657-app-status-pdf' of https://gitea.verdnatura.es/verdnatura/salix into 8657-app-status-pdf
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-24 13:06:54 +01:00
Alex Moreno 909b96087f feat: refs #8657 update application status report to display dynamic status 2025-02-24 13:06:53 +01:00
Alex Moreno 9fad296757 Merge branch 'dev' into 8657-app-status-pdf
gitea/salix/pipeline/pr-dev Something is wrong with the build of this commit Details
2025-02-24 11:38:33 +00:00
Alex Moreno 75b3be8b79 feat: refs #8657 add application status report and related templates
gitea/salix/pipeline/pr-master There was a failure building this commit Details
gitea/salix/pipeline/pr-dev There was a failure building this commit Details
2025-02-24 12:26:17 +01:00
108 changed files with 851 additions and 1607 deletions

View File

@ -1,59 +0,0 @@
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

@ -1,93 +0,0 @@
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

@ -1,14 +0,0 @@
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

@ -1,10 +0,0 @@
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

@ -1,11 +0,0 @@
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

@ -1,10 +0,0 @@
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

@ -1,14 +0,0 @@
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

@ -1,12 +0,0 @@
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

@ -1,10 +0,0 @@
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

@ -1,11 +0,0 @@
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

@ -1,11 +0,0 @@
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

@ -1,11 +0,0 @@
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

@ -1,10 +0,0 @@
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

@ -1,10 +0,0 @@
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,9 +70,6 @@
"Expedition_PrintOut": { "Expedition_PrintOut": {
"dataSource": "vn" "dataSource": "vn"
}, },
"FloricodeConfig": {
"dataSource": "vn"
},
"Image": { "Image": {
"dataSource": "vn" "dataSource": "vn"
}, },
@ -157,9 +154,6 @@
"SaySimpleConfig": { "SaySimpleConfig": {
"dataSource": "vn" "dataSource": "vn"
}, },
"TableMultiConfig": {
"dataSource": "vn"
},
"TempContainer": { "TempContainer": {
"dataSource": "tempStorage" "dataSource": "tempStorage"
}, },

View File

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

View File

@ -1,28 +0,0 @@
{
"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

@ -1,24 +0,0 @@
{
"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

@ -17,7 +17,7 @@ async function init() {
}); });
// FIXME: Workaround to wait for loopback to be ready // FIXME: Workaround to wait for loopback to be ready
app.emit('started'); app.emit('started');
await app.models.Application.status(); await getStatus();
} }
async function deinit() { async function deinit() {
@ -33,3 +33,20 @@ module.exports = {
if (require.main === module) if (require.main === module)
init(); init();
async function getStatus() {
const MAX_ATTEMPTS = 10;
let attempts = 0;
return new Promise((resolve, reject) => {
const intervalo = setInterval(async() => {
try {
const resultado = await app.models.Application.status();
clearInterval(intervalo);
resolve(resultado);
} catch (error) {
console.log('Attempt to connect ' + attempts + '/' + MAX_ATTEMPTS);
if (attempts >= MAX_ATTEMPTS)reject(error);
}
attempts++;
}, 100);
});
}

View File

@ -16,8 +16,8 @@ INSERT INTO vn.entryConfig (defaultEntry, mailToNotify, inventorySupplierFk, max
*/ */
-- XXX: eti -- XXX: eti
INSERT INTO vn.travel (id,shipped,landed,availabled,warehouseInFk,warehouseOutFk,`ref`,m3,kg,cargoSupplierFk) INSERT INTO vn.travel (id,shipped,landed,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); VALUES (9,'2022-05-20','2022-05-20',13,4,'nine travel',69.0,600,1);
/* #5483 /* #5483
INSERT INTO vn.entry (id, supplierFk, dated, invoiceNumber, evaNotes, travelFk, companyFk) INSERT INTO vn.entry (id, supplierFk, dated, invoiceNumber, evaNotes, travelFk, companyFk)
VALUES VALUES
@ -278,15 +278,6 @@ INSERT INTO `hedera`.`tpvConfig` (currency, terminal, transactionType, maxAmount
INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk) INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk)
VALUES (1, 442); 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 -- XXX
SET foreign_key_checks = 1; SET foreign_key_checks = 1;

View File

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

View File

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

View File

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

View File

@ -0,0 +1,8 @@
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

@ -0,0 +1,8 @@
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

@ -1,8 +0,0 @@
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

@ -1,8 +0,0 @@
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

@ -1,91 +0,0 @@
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

@ -1,64 +0,0 @@
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,95 +0,0 @@
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

@ -1,39 +0,0 @@
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

@ -1,36 +0,0 @@
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

@ -1,42 +0,0 @@
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

@ -1,64 +0,0 @@
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,15 +0,0 @@
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

@ -1,17 +0,0 @@
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

@ -0,0 +1,16 @@
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

@ -0,0 +1,20 @@
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

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

View File

@ -0,0 +1,7 @@
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

@ -0,0 +1,19 @@
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

@ -0,0 +1,33 @@
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

@ -0,0 +1,73 @@
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

@ -0,0 +1,47 @@
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

@ -0,0 +1,66 @@
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

@ -0,0 +1,123 @@
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

@ -0,0 +1,16 @@
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

@ -0,0 +1,61 @@
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

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

View File

@ -1,32 +0,0 @@
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

@ -1,90 +0,0 @@
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

@ -1,34 +0,0 @@
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

@ -1,88 +0,0 @@
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

@ -0,0 +1,20 @@
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

@ -0,0 +1,22 @@
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

@ -0,0 +1,15 @@
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

@ -0,0 +1,22 @@
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

@ -0,0 +1,16 @@
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

@ -1,15 +0,0 @@
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

@ -104,24 +104,6 @@ BEGIN
LEFT JOIN agencyModeItemType ait LEFT JOIN agencyModeItemType ait
ON ait.agencyModeFk = vAgencyModeFk ON ait.agencyModeFk = vAgencyModeFk
AND ait.itemTypeFk = itt.id 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 WHERE a.calc_id = vAvailableCalc
AND a.available > 0 AND a.available > 0
AND (ag.isAnyVolumeAllowed OR NOT itt.isUnconventionalSize) AND (ag.isAnyVolumeAllowed OR NOT itt.isUnconventionalSize)
@ -131,8 +113,7 @@ BEGIN
it.size <= z.itemMaxSize OR z.itemMaxSize IS NULL)) it.size <= z.itemMaxSize OR z.itemMaxSize IS NULL))
AND cit.id IS NULL AND cit.id IS NULL
AND zit.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; DROP TEMPORARY TABLE tmp.buyUltimate;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -22,10 +22,6 @@ trig: BEGIN
SET NEW.editorFk = account.myUser_getId(); 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 SELECT it.workerFk INTO vBuyerFk
FROM item i FROM item i
JOIN itemType it ON it.id = i.typeFk JOIN itemType it ON it.id = i.typeFk

View File

@ -25,10 +25,6 @@ trig:BEGIN
SET NEW.editorFk = account.myUser_getId(); 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 SELECT defaultEntry INTO vDefaultEntry
FROM entryConfig; FROM entryConfig;

View File

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

View File

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

View File

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

View File

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

View File

@ -1,16 +0,0 @@
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

@ -1,6 +0,0 @@
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

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

View File

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

View File

@ -1,10 +0,0 @@
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

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

View File

@ -1,10 +0,0 @@
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

@ -1,8 +0,0 @@
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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,11 +0,0 @@
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

@ -1,65 +0,0 @@
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

@ -1,4 +0,0 @@
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

@ -1,3 +0,0 @@
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

@ -1,4 +0,0 @@
-- 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

@ -1,4 +0,0 @@
-- 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

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

View File

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

View File

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

View File

@ -1,4 +1,6 @@
const {Report} = require('vn-print');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('status', { Self.remoteMethod('status', {
description: 'Gets the backend status', description: 'Gets the backend status',
@ -14,6 +16,7 @@ module.exports = Self => {
Self.status = async() => { Self.status = async() => {
await Self.rawSql(`SELECT TRUE`); await Self.rawSql(`SELECT TRUE`);
await new Report('application-status').toPdfStream();
return true; return true;
}; };
}; };

View File

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

View File

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

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