Compare commits
8 Commits
dev
...
8657-app-s
Author | SHA1 | Date |
---|---|---|
|
b660c82ffa | |
|
f2421c806a | |
|
3ed1d2e163 | |
|
acf0f82d85 | |
|
186219f057 | |
|
909b96087f | |
|
9fad296757 | |
|
75b3be8b79 |
|
@ -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();
|
||||
});
|
||||
});
|
|
@ -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;
|
||||
};
|
||||
};
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
|
@ -70,9 +70,6 @@
|
|||
"Expedition_PrintOut": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"FloricodeConfig": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"Image": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
|
@ -157,9 +154,6 @@
|
|||
"SaySimpleConfig": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"TableMultiConfig": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"TempContainer": {
|
||||
"dataSource": "tempStorage"
|
||||
},
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
module.exports = Self => {
|
||||
require('../methods/edi/updateData')(Self);
|
||||
require('../methods/edi/syncData')(Self);
|
||||
};
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,7 +17,7 @@ async function init() {
|
|||
});
|
||||
// FIXME: Workaround to wait for loopback to be ready
|
||||
app.emit('started');
|
||||
await app.models.Application.status();
|
||||
await getStatus();
|
||||
}
|
||||
|
||||
async function deinit() {
|
||||
|
@ -33,3 +33,20 @@ module.exports = {
|
|||
if (require.main === module)
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -16,8 +16,8 @@ INSERT INTO vn.entryConfig (defaultEntry, mailToNotify, inventorySupplierFk, max
|
|||
*/
|
||||
-- XXX: eti
|
||||
|
||||
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);
|
||||
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);
|
||||
/* #5483
|
||||
INSERT INTO vn.entry (id, supplierFk, dated, invoiceNumber, evaNotes, travelFk, companyFk)
|
||||
VALUES
|
||||
|
@ -278,15 +278,6 @@ 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;
|
||||
|
|
|
@ -854,8 +854,7 @@ INSERT INTO `vn`.`ticketTracking`(`ticketFk`, `stateFk`, `userFk`, `created`)
|
|||
|
||||
INSERT INTO `vn`.`deliveryPoint` (`id`, `name`, `ubication`)
|
||||
VALUES
|
||||
(1, 'Gotham','1007 Mountain Drive, Gotham'),
|
||||
(6, 'Stark Tower','200 Park Avenue, Nueva York');
|
||||
(1, 'Gotham','1007 Mountain Drive, Gotham');
|
||||
|
||||
INSERT INTO `vn`.`vehicle`(`id`, `numberPlate`, `tradeMark`, `model`, `companyFk`, `warehouseFk`, `description`, `m3`, `isActive`, `deliveryPointFk`, `chassis`, `leasing`, `supplierFk`, `fuelTypeFk`, `bankPolicyFk`)
|
||||
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),
|
||||
(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`)
|
||||
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`.`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`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `evaNotes`, `typeFk`)
|
||||
VALUES
|
||||
|
@ -2833,18 +2832,12 @@ INSERT INTO `bs`.`defaulter` (`clientFk`, `amount`, `created`, `defaulterSinced`
|
|||
(1109, 500, util.VN_CURDATE(), util.VN_CURDATE());
|
||||
|
||||
UPDATE `vn`.`route`
|
||||
SET
|
||||
`invoiceInFk` = 1,
|
||||
`kmStart` = 0,
|
||||
`kmEnd` = 0
|
||||
WHERE `id` = 1;
|
||||
SET `invoiceInFk`=1
|
||||
WHERE `id`=1;
|
||||
|
||||
UPDATE `vn`.`route`
|
||||
SET
|
||||
`invoiceInFk` = 2,
|
||||
`kmStart` = 0,
|
||||
`kmEnd` = 0
|
||||
WHERE `id` = 2;
|
||||
SET `invoiceInFk`=2
|
||||
WHERE `id`=2;
|
||||
|
||||
INSERT INTO `bs`.`sale` (`saleFk`, `amount`, `dated`, `typeFk`, `clientFk`)
|
||||
VALUES
|
||||
|
@ -3338,7 +3331,6 @@ INSERT IGNORE INTO vn.itemType
|
|||
INSERT IGNORE INTO vn.travel
|
||||
SET id = 99,
|
||||
shipped = CURDATE(),
|
||||
availabled = CURDATE(),
|
||||
landed = CURDATE(),
|
||||
warehouseInFk = 999,
|
||||
warehouseOutFk = 1,
|
||||
|
@ -4155,8 +4147,5 @@ 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');
|
||||
|
|
|
@ -6,15 +6,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`available_refresh`
|
|||
`vAvailabled` DATETIME
|
||||
)
|
||||
proc: BEGIN
|
||||
/**
|
||||
* 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 vStartDate DATE;
|
||||
DECLARE vReserveDate DATETIME;
|
||||
DECLARE vParams CHAR(100);
|
||||
DECLARE vInventoryDate DATE;
|
||||
|
@ -36,7 +28,7 @@ proc: BEGIN
|
|||
|
||||
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);
|
||||
CALL cache_calc_start (vCalc, vRefresh, 'available', vParams);
|
||||
|
@ -46,16 +38,10 @@ proc: BEGIN
|
|||
END IF;
|
||||
|
||||
-- Calcula algunos parámetros necesarios
|
||||
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
|
||||
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
|
||||
FROM hedera.orderConfig;
|
||||
|
||||
SELECT w.id INTO vWarehouseFkInventory
|
||||
|
@ -63,22 +49,22 @@ proc: BEGIN
|
|||
WHERE w.code = 'inv';
|
||||
|
||||
-- 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))
|
||||
ENGINE = MEMORY
|
||||
SELECT i.id itemFk,
|
||||
util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended,
|
||||
it.life
|
||||
util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended, it.life
|
||||
FROM vn.item i
|
||||
LEFT JOIN (
|
||||
SELECT b.itemFk, MAX(t.availabled) maxLanded
|
||||
SELECT b.itemFk, MAX(t.landed) 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 vDated
|
||||
WHERE t.landed BETWEEN vLifeScope AND vStartDate
|
||||
AND t.warehouseInFk = vWarehouse
|
||||
AND t.warehouseOutFk <> vWarehouseFkInventory
|
||||
AND it.life
|
||||
|
@ -86,78 +72,62 @@ proc: BEGIN
|
|||
GROUP BY b.itemFk
|
||||
) c ON i.id = c.itemFk
|
||||
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;
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp.itemCalc;
|
||||
CREATE TEMPORARY TABLE tmp.itemCalc
|
||||
(INDEX (itemFk,warehouseFk))
|
||||
ENGINE = MEMORY
|
||||
SELECT itemFk,
|
||||
vWarehouse warehouseFk,
|
||||
dated,
|
||||
SUM(quantity) quantity
|
||||
FROM (
|
||||
SELECT i.itemFk,
|
||||
i.shipped dated,
|
||||
i.quantity
|
||||
SELECT itemFk, vWarehouse warehouseFk, DATE(dated) 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 >= vAvailabled
|
||||
AND (ir.ended IS NULL
|
||||
OR i.shipped <= ir.ended)
|
||||
WHERE i.shipped >= vStartDate
|
||||
AND (ir.ended IS NULL OR i.shipped <= ir.ended)
|
||||
AND i.warehouseFk = vWarehouse
|
||||
UNION ALL
|
||||
SELECT i.itemFk,
|
||||
i.availabled,
|
||||
i.quantity
|
||||
SELECT i.itemFk, IFNULL(i.availabled, i.landed), i.quantity
|
||||
FROM vn.itemEntryIn i
|
||||
JOIN itemRange ir ON ir.itemFk = i.itemFk
|
||||
WHERE i.availabled >= vAvailabled
|
||||
AND (ir.ended IS NULL
|
||||
OR i.availabled <= ir.ended)
|
||||
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)
|
||||
AND i.warehouseInFk = vWarehouse
|
||||
AND wf.entryFk IS NULL
|
||||
UNION ALL
|
||||
SELECT i.itemFk,
|
||||
i.shipped,
|
||||
i.quantity
|
||||
SELECT i.itemFk, i.shipped, i.quantity
|
||||
FROM vn.itemEntryOut i
|
||||
JOIN itemRange ir ON ir.itemFk = i.itemFk
|
||||
WHERE i.shipped >= vAvailabled
|
||||
AND (ir.ended IS NULL
|
||||
OR i.shipped <= ir.ended)
|
||||
WHERE i.shipped >= vStartDate
|
||||
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 >= vDated
|
||||
AND (ir.ended IS NULL
|
||||
OR r.shipment <= ir.ended)
|
||||
WHERE r.shipment >= vStartDate
|
||||
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(vAvailabled);
|
||||
CALL vn.item_getAtp(vDated);
|
||||
|
||||
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;
|
||||
|
|
|
@ -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 día de
|
||||
* Crea o actualiza la cache con el disponible hasta el día de
|
||||
* ayer. Esta cache es usada como base para otros procedimientos
|
||||
* 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
|
||||
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 availabled >= v_date_inv
|
||||
AND availabled < vCURDATE
|
||||
AND isVirtualStock is FALSE
|
||||
WHERE landed >= v_date_inv AND landed < 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;
|
||||
|
||||
|
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -1,10 +1,10 @@
|
|||
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
|
||||
/**
|
||||
* 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 vExpired DATETIME;
|
||||
|
@ -14,37 +14,37 @@ BEGIN
|
|||
DECLARE vAvailable INT;
|
||||
DECLARE vSupplied INT;
|
||||
DECLARE vSuppliedFromRequest INT;
|
||||
DECLARE vOutFk INT;
|
||||
DECLARE vOutboundFk INT;
|
||||
DECLARE vLack INT;
|
||||
DECLARE vHasPicks BOOL;
|
||||
DECLARE vDone BOOL;
|
||||
|
||||
DECLARE vOuts CURSOR FOR
|
||||
SELECT outFk, lack, lack < quantity
|
||||
FROM buyOut
|
||||
DECLARE vOutbounds CURSOR FOR
|
||||
SELECT id, lack, lack < quantity
|
||||
FROM outbound
|
||||
WHERE warehouseFk = vWarehouse
|
||||
AND itemFk = vItem
|
||||
AND dated >= vDated
|
||||
AND (vExpired IS NULL OR dated < vExpired)
|
||||
ORDER BY dated, created, outFk;
|
||||
ORDER BY dated, created;
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
||||
SET vDone = TRUE;
|
||||
|
||||
SELECT warehouseFk, itemFk, available, quantity, expired, dated
|
||||
INTO vWarehouse, vItem, vAvailable, vQuantity, vExpired, vDated
|
||||
FROM buyLot
|
||||
WHERE lotFk = vSelf;
|
||||
FROM inbound
|
||||
WHERE id = vSelf;
|
||||
|
||||
IF vAvailable IS NULL THEN
|
||||
SET vAvailable = vQuantity;
|
||||
END IF;
|
||||
|
||||
OPEN vOuts;
|
||||
OPEN vOutbounds;
|
||||
|
||||
myLoop: LOOP
|
||||
SET vDone = FALSE;
|
||||
FETCH vOuts INTO vOutFk, vLack, vHasPicks;
|
||||
FETCH vOutbounds INTO vOutboundFk, vLack, vHasPicks;
|
||||
|
||||
IF vDone THEN
|
||||
LEAVE myLoop;
|
||||
|
@ -54,19 +54,19 @@ BEGIN
|
|||
|
||||
IF vSupplied > 0 THEN
|
||||
SET vAvailable = vAvailable - vSupplied;
|
||||
UPDATE buyOut
|
||||
UPDATE outbound
|
||||
SET lack = lack - vSupplied
|
||||
WHERE outFk = vOutFk;
|
||||
WHERE id = vOutboundFk;
|
||||
END IF;
|
||||
|
||||
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 vAvailable = vAvailable - vSuppliedFromRequest;
|
||||
END IF;
|
||||
|
||||
IF vSupplied > 0 THEN
|
||||
CALL buyPick_add(vSelf, vOutFk, vSupplied);
|
||||
CALL inbound_addPick(vSelf, vOutboundFk, vSupplied);
|
||||
END IF;
|
||||
|
||||
IF vAvailable <= 0 THEN
|
||||
|
@ -74,11 +74,11 @@ BEGIN
|
|||
END IF;
|
||||
END LOOP;
|
||||
|
||||
CLOSE vOuts;
|
||||
CLOSE vOutbounds;
|
||||
|
||||
UPDATE buyLot
|
||||
UPDATE inbound
|
||||
SET isSync = TRUE,
|
||||
available = vAvailable
|
||||
WHERE lotFk = vSelf;
|
||||
WHERE id = vSelf;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -1,10 +1,10 @@
|
|||
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
|
||||
/**
|
||||
* 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 vItem INT;
|
||||
|
@ -12,33 +12,33 @@ BEGIN
|
|||
DECLARE vLack INT;
|
||||
DECLARE vSupplied INT;
|
||||
DECLARE vSuppliedFromRequest INT;
|
||||
DECLARE vLotFk INT;
|
||||
DECLARE vInboundFk INT;
|
||||
DECLARE vAvailable INT;
|
||||
DECLARE vHasPicks BOOL;
|
||||
DECLARE vDone BOOL;
|
||||
|
||||
DECLARE vBuyLots CURSOR FOR
|
||||
SELECT lotFk, available, available < quantity
|
||||
FROM buyLot
|
||||
DECLARE vInbounds CURSOR FOR
|
||||
SELECT id, available, available < quantity
|
||||
FROM inbound
|
||||
WHERE warehouseFk = vWarehouse
|
||||
AND itemFk = vItem
|
||||
AND dated <= vDated
|
||||
AND (expired IS NULL OR expired > vDated)
|
||||
ORDER BY dated, lotFk;
|
||||
ORDER BY dated;
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
||||
SET vDone = TRUE;
|
||||
|
||||
SELECT warehouseFk, itemFk, dated, lack
|
||||
INTO vWarehouse, vItem, vDated, vLack
|
||||
FROM buyOut
|
||||
WHERE outFk = vSelf;
|
||||
FROM outbound
|
||||
WHERE id = vSelf;
|
||||
|
||||
OPEN vBuyLots;
|
||||
OPEN vInbounds;
|
||||
|
||||
myLoop: LOOP
|
||||
SET vDone = FALSE;
|
||||
FETCH vBuyLots INTO vLotFk, vAvailable, vHasPicks;
|
||||
FETCH vInbounds INTO vInboundFk, vAvailable, vHasPicks;
|
||||
|
||||
IF vDone THEN
|
||||
LEAVE myLoop;
|
||||
|
@ -48,19 +48,19 @@ BEGIN
|
|||
|
||||
IF vSupplied > 0 THEN
|
||||
SET vLack = vLack - vSupplied;
|
||||
UPDATE buyLot
|
||||
UPDATE inbound
|
||||
SET available = available - vSupplied
|
||||
WHERE lotFk = vLotFk;
|
||||
WHERE id = vInboundFk;
|
||||
END IF;
|
||||
|
||||
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 vLack = vLack - vSuppliedFromRequest;
|
||||
END IF;
|
||||
|
||||
IF vSupplied > 0 THEN
|
||||
CALL buyPick_add(vLotFk, vSelf, vSupplied);
|
||||
CALL inbound_addPick(vInboundFk, vSelf, vSupplied);
|
||||
END IF;
|
||||
|
||||
IF vLack = 0 THEN
|
||||
|
@ -68,11 +68,11 @@ BEGIN
|
|||
END IF;
|
||||
END LOOP;
|
||||
|
||||
CLOSE vBuyLots;
|
||||
CLOSE vInbounds;
|
||||
|
||||
UPDATE buyOut
|
||||
UPDATE outbound
|
||||
SET isSync = TRUE,
|
||||
lack = vLack
|
||||
WHERE outFk = vSelf;
|
||||
WHERE id = vSelf;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -104,24 +104,6 @@ BEGIN
|
|||
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)
|
||||
|
@ -131,8 +113,7 @@ 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 pd.id IS NULL;
|
||||
AND ait.id IS NULL;
|
||||
|
||||
DROP TEMPORARY TABLE tmp.buyUltimate;
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
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
|
||||
/**
|
||||
* 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)
|
||||
* @return tmp.itemAtp(itemFk, warehouseFk, quantity)
|
||||
*/
|
||||
|
@ -16,7 +17,7 @@ BEGIN
|
|||
SELECT itemFk, warehouseFk, dated, quantity
|
||||
FROM tmp.itemCalc
|
||||
UNION ALL
|
||||
SELECT itemFk, warehouseFk, vAvailabled, 0
|
||||
SELECT itemFk, warehouseFk, vDated, 0
|
||||
FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
|
||||
) t1
|
||||
GROUP BY itemFk, warehouseFk, dated
|
||||
|
@ -27,7 +28,7 @@ BEGIN
|
|||
SET @lastQuantity := 0;
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
|
||||
(PRIMARY KEY (itemFk, wareHouseFk))
|
||||
(INDEX (itemFk, wareHouseFk))
|
||||
SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
|
||||
FROM (
|
||||
SELECT
|
||||
|
@ -42,10 +43,6 @@ 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 ;
|
||||
|
|
|
@ -99,7 +99,7 @@ BEGIN
|
|||
),
|
||||
sales 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,
|
||||
st2.alertLevel,
|
||||
st2.name,
|
||||
|
@ -114,7 +114,7 @@ BEGIN
|
|||
cb.claimFk
|
||||
FROM vn.sale s
|
||||
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.state st ON st.code = ts.code
|
||||
JOIN vn.client c ON c.id = t.clientFk
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getMinacum`(
|
||||
vWarehouseFk TINYINT,
|
||||
vAvailabled DATETIME,
|
||||
vDated DATE,
|
||||
vRange INT,
|
||||
vItemFk INT
|
||||
)
|
||||
|
@ -11,12 +11,11 @@ BEGIN
|
|||
* especificado, en caso de NULL para todos.
|
||||
*
|
||||
* @param vWarehouseFk Id warehouse
|
||||
* @param vAvailabled Fecha inicio
|
||||
* @param vDated 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
|
||||
|
@ -28,25 +27,25 @@ BEGIN
|
|||
sub.warehouseFk
|
||||
FROM (
|
||||
SELECT s.itemFk,
|
||||
t.shipped dated,
|
||||
DATE(t.shipped) dated,
|
||||
-s.quantity quantity,
|
||||
t.warehouseFk
|
||||
FROM sale s
|
||||
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 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.availabled,
|
||||
t.landed,
|
||||
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.availabled BETWEEN vAvailabled AND vDatedTo
|
||||
WHERE t.landed BETWEEN vDated AND vDatedTo
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND NOT e.isExcludedFromAvailable
|
||||
AND b.quantity <> 0
|
||||
|
@ -59,7 +58,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 vAvailabled AND vDatedTo
|
||||
WHERE t.shipped BETWEEN vDated AND vDatedTo
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseOutFk = vWarehouseFk)
|
||||
AND NOT e.isExcludedFromAvailable
|
||||
AND b.quantity <> 0
|
||||
|
@ -85,7 +84,7 @@ BEGIN
|
|||
) sub
|
||||
GROUP BY sub.itemFk, sub.warehouseFk, sub.dated;
|
||||
|
||||
CALL item_getAtp(vAvailabled);
|
||||
CALL item_getAtp(vDated);
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.itemMinacum
|
||||
(INDEX(itemFk))
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getStock`(
|
||||
vWarehouseFk SMALLINT,
|
||||
vAvailabled DATETIME,
|
||||
vDated DATE,
|
||||
vItemFk INT
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* 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 vAvailabled Maximum time to filter
|
||||
* @param vDated Max date to filter
|
||||
* @param vItemFk Item id
|
||||
*
|
||||
* @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
|
||||
(UNIQUE INDEX i USING HASH (itemFk))
|
||||
|
@ -28,15 +28,15 @@ BEGIN
|
|||
SELECT itemFk, quantity
|
||||
FROM itemTicketOut
|
||||
WHERE shipped >= util.VN_CURDATE()
|
||||
AND shipped < vAvailabled
|
||||
AND shipped < vDated
|
||||
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 iei.availabled >= util.VN_CURDATE()
|
||||
AND iei.availabled < vAvailabled
|
||||
WHERE IFNULL(iei.availabled, iei.landed) >= util.VN_CURDATE()
|
||||
AND IFNULL(iei.availabled, iei.landed) < vDated
|
||||
AND iei.warehouseInFk = vWarehouseFk
|
||||
AND (vItemFk IS NULL OR iei.itemFk = vItemFk)
|
||||
UNION ALL
|
||||
|
@ -44,16 +44,23 @@ BEGIN
|
|||
FROM itemEntryOut ieo
|
||||
JOIN item i ON i.id = ieo.itemFk
|
||||
WHERE ieo.shipped >= util.VN_CURDATE()
|
||||
AND ieo.shipped < vAvailabled
|
||||
AND ieo.shipped < vDated
|
||||
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 ;
|
||||
|
|
|
@ -6,7 +6,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_getMovable`(
|
|||
)
|
||||
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
|
||||
* asume que siempre es posible
|
||||
*
|
||||
|
@ -25,7 +25,7 @@ BEGIN
|
|||
CALL item_getMinacum(
|
||||
vWarehouseFk,
|
||||
vNewShipped,
|
||||
DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), DATE(vNewShipped)),
|
||||
DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), vNewShipped),
|
||||
NULL
|
||||
);
|
||||
|
||||
|
|
|
@ -22,10 +22,6 @@ 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
|
||||
|
|
|
@ -25,10 +25,6 @@ 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;
|
||||
|
||||
|
|
|
@ -17,14 +17,8 @@ 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 ;
|
||||
|
|
|
@ -41,14 +41,8 @@ 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 ;
|
||||
|
|
|
@ -31,8 +31,7 @@ AS SELECT `e`.`gestDocFk` AS `gestdoc_id`,
|
|||
`e`.`invoiceAmount` AS `invoiceAmount`,
|
||||
`w`.`code` AS `buyerCode`,
|
||||
`e`.`typeFk` AS `typeFk`,
|
||||
`w3`.`code` AS `observationWorkerCode`,
|
||||
`tr`.`availabled`
|
||||
`w3`.`code` AS `observationWorkerCode`
|
||||
FROM (
|
||||
(
|
||||
(
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
DROP TABLE stock.log;
|
|
@ -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;
|
|
@ -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);
|
|
@ -1,4 +0,0 @@
|
|||
ALTER TABLE hedera.orderRow
|
||||
ADD isReserved BOOL NOT NULL DEFAULT TRUE
|
||||
COMMENT 'Whether has an available reservation',
|
||||
ADD INDEX(isReserved);
|
|
@ -1,4 +0,0 @@
|
|||
ALTER TABLE vn.ticket
|
||||
ADD isAlive BOOL NOT NULL DEFAULT TRUE
|
||||
COMMENT 'Whether it is alive',
|
||||
ADD INDEX(isAlive);
|
|
@ -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);
|
|
@ -1 +0,0 @@
|
|||
DROP TABLE stock.visible;
|
|
@ -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);
|
|
@ -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;
|
|
@ -1,2 +0,0 @@
|
|||
INSERT INTO stock.config (id, saleLife)
|
||||
VALUES (1, 90);
|
|
@ -1 +0,0 @@
|
|||
CREATE SEQUENCE IF NOT EXISTS vn.buyLot;
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE vn.sale
|
||||
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE hedera.orderRow
|
||||
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE vn.buy
|
||||
ADD COLUMN IF NOT EXISTS lotFk INT UNSIGNED NOT NULL DEFAULT nextval(vn.buyLot) AFTER id;
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE vn.sale
|
||||
ADD UNIQUE IF NOT EXISTS (lotFk);
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE hedera.orderRow
|
||||
ADD UNIQUE IF NOT EXISTS (lotFk);
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE vn.buy
|
||||
ADD UNIQUE IF NOT EXISTS (lotFk);
|
|
@ -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');
|
|
@ -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';
|
|
@ -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);
|
|
@ -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';
|
|
@ -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';
|
|
@ -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';
|
|
@ -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');
|
|
@ -1,2 +0,0 @@
|
|||
ALTER TABLE cache.last_buy
|
||||
DROP FOREIGN KEY IF EXISTS last_buy_FK_1;
|
|
@ -1,6 +0,0 @@
|
|||
-- Place your SQL code here
|
||||
UPDATE vn.travel
|
||||
SET availabled = landed
|
||||
WHERE availabled IS NULL;
|
||||
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
|
||||
const {Report} = require('vn-print');
|
||||
|
||||
module.exports = Self => {
|
||||
Self.remoteMethod('status', {
|
||||
description: 'Gets the backend status',
|
||||
|
@ -14,6 +16,7 @@ module.exports = Self => {
|
|||
|
||||
Self.status = async() => {
|
||||
await Self.rawSql(`SELECT TRUE`);
|
||||
await new Report('application-status').toPdfStream();
|
||||
return true;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -95,7 +95,6 @@ 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
|
||||
|
@ -104,7 +103,6 @@ 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`
|
||||
|
|
|
@ -167,7 +167,7 @@ module.exports = Self => {
|
|||
}
|
||||
|
||||
smtp.send({
|
||||
to: 'administracion@verdnatura.es', // #8687
|
||||
to: config.app.reportEmail,
|
||||
subject: '[API] Nightly ticket closure report',
|
||||
html: body,
|
||||
}).catch(err => console.error(err));
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue