From 4e1ab2652c6b3bc25ee3b1f03cd89260ddd1ee45 Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 15 Jan 2025 14:59:17 +0100 Subject: [PATCH] feat: refs #7984 add currency in order sections --- db/dump/fixtures.before.sql | 5 ++-- .../hedera/functions/order_getTotal.sql | 2 +- .../hedera/procedures/order_getTax.sql | 7 +++-- .../hedera/procedures/order_update.sql | 8 ++--- .../vn/functions/client_getCompany.sql | 23 ++++++++++++++ .../vn/functions/client_getCurrency.sql | 23 ++++++++++++++ db/routines/vn/functions/currency_getRate.sql | 2 +- db/routines/vn/procedures/orderCreate.sql | 14 +++++---- db/routines/vn/procedures/orderListCreate.sql | 6 ++-- .../11307-blackAralia/00-firstScript.sql | 30 ++++++++++++++++++- modules/client/back/models/client.json | 21 +++++++++++-- .../order/back/methods/order/catalogFilter.js | 11 +++++-- .../methods/order/getItemTypeAvailable.js | 5 ++-- modules/order/back/methods/order/getTotal.js | 21 ++++++++++--- modules/order/back/methods/order/getVAT.js | 15 +++++++--- modules/order/back/methods/order/new.js | 16 ++++++++-- .../back/methods/order/updateBasicData.js | 2 ++ modules/order/back/models/order-row.json | 3 ++ modules/order/back/models/order.json | 8 +++++ 19 files changed, 184 insertions(+), 38 deletions(-) create mode 100644 db/routines/vn/functions/client_getCompany.sql create mode 100644 db/routines/vn/functions/client_getCurrency.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 2380f5eab..5b563902a 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4046,9 +4046,10 @@ INSERT INTO vn.workerIrpf (workerFk,spouseNif, geographicMobilityDate) VALUES (1106,'26493101E','2019-09-20'); INSERT INTO vn.referenceRate (currencyFk, dated, value) - VALUES (2, '2000-12-01', 1.0495), + VALUES (2, '2000-12-01', 1.0495), (2, '2001-01-01', 1.0531), - (2, '2001-02-01', 7.6347); + (2, '2001-02-01', 7.6347), + (2, '2000-12-31', 7.6347); INSERT IGNORE INTO vn.osrmConfig (id,url,tolerance) VALUES (1,'https://router.project-osrm.org', 0.002); diff --git a/db/routines/hedera/functions/order_getTotal.sql b/db/routines/hedera/functions/order_getTotal.sql index 2edb6340d..5ea68556b 100644 --- a/db/routines/hedera/functions/order_getTotal.sql +++ b/db/routines/hedera/functions/order_getTotal.sql @@ -20,7 +20,7 @@ BEGIN CALL order_getTotal; - SELECT total INTO vTotal FROM tmp.orderTotal; + SELECT IFNULL(foreignTotal, total) INTO vTotal FROM tmp.orderTotal; DROP TEMPORARY TABLE tmp.`order`, diff --git a/db/routines/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql index e7cd6284e..625f8ba3f 100644 --- a/db/routines/hedera/procedures/order_getTax.sql +++ b/db/routines/hedera/procedures/order_getTax.sql @@ -29,7 +29,8 @@ BEGIN oro.amount * oro.price total, s.countryFk, ata.areaFk, - itc.taxClassFk + itc.taxClassFk, + o.currencyFk FROM hedera.orderRow oro JOIN tmp.order tor ON tor.orderFk = oro.orderFk JOIN hedera.`order` o ON o.id = tor.orderFk @@ -46,7 +47,7 @@ BEGIN tc.code, SUM(o.total) taxableBase, pgc.rate, - currency_getRate(o.currencyFk, NULL) * + vn.currency_getRate(o.currencyFk, NULL) * SUM(o.total) foreignTaxableBase, o.currencyFk FROM orders o @@ -70,7 +71,7 @@ BEGIN SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax, currencyFk, foreignTaxableBase, - currency_getRate(o.currencyFk, NULL) * + vn.currency_getRate(currencyFk, NULL) * SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) foreignTax FROM tmp.orderTax GROUP BY orderFk, `code`; diff --git a/db/routines/hedera/procedures/order_update.sql b/db/routines/hedera/procedures/order_update.sql index 937aeffd5..211feefa0 100644 --- a/db/routines/hedera/procedures/order_update.sql +++ b/db/routines/hedera/procedures/order_update.sql @@ -30,14 +30,14 @@ proc: BEGIN JOIN orderRowComponent c ON c.rowFk = r.id WHERE r.orderFk = vSelf; - UPDATE orderRow r - JOIN `order` o ON o.id = r.orderFk + UPDATE orderRow r + JOIN `order` o ON o.id = r.orderFk LEFT JOIN tmp.ticketComponentPrice p ON p.warehouseFk = r.warehouseFk AND p.itemFk = r.itemFk AND p.rate = r.rate LEFT JOIN tmp.zoneGetShipped t ON t.warehouseFk = r.warehouseFk SET r.price = p.price, - r.foreignPrice = currency_getRate(o.currencyFk, NULL) * p.price, + r.foreignPrice = vn.currency_getRate(o.currencyFk, NULL) * p.price, r.amount = IF(p.itemFk IS NOT NULL, r.amount + IF(@m := MOD(r.amount, p.`grouping`), p.`grouping` - @m, 0) , 0), @@ -54,7 +54,7 @@ proc: BEGIN ON t.id = c.componentFk AND (t.classRate IS NULL OR t.classRate = r.rate) WHERE r.orderFk = vSelf; - + CALL vn.ticketCalculatePurge; END IF; diff --git a/db/routines/vn/functions/client_getCompany.sql b/db/routines/vn/functions/client_getCompany.sql new file mode 100644 index 000000000..bf2647054 --- /dev/null +++ b/db/routines/vn/functions/client_getCompany.sql @@ -0,0 +1,23 @@ +-- DELIMITER $$ +-- CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION vn.client_getCompany(vSelf INT) +-- RETURNS INT(3) +-- DETERMINISTIC +-- BEGIN +-- /** +-- * Devuelve la moneda por defecto del cliente dado +-- * +-- * @param vSelf id del cliente +-- * @return devuelve id de la compaƱia por defecto +-- */ +-- DECLARE vCompanyFk INT; + +-- SELECT co.currencyFk INTO vCompanyFk +-- FROM client c +-- JOIN vn.province p ON p.id = c.provinceFk +-- JOIN vn.country co ON co.id = p.countryFk +-- WHERE c.id = vSelf +-- LIMIT 1; + +-- RETURN vCompanyFk; +-- END$$ +-- DELIMITER ; diff --git a/db/routines/vn/functions/client_getCurrency.sql b/db/routines/vn/functions/client_getCurrency.sql new file mode 100644 index 000000000..7c194190f --- /dev/null +++ b/db/routines/vn/functions/client_getCurrency.sql @@ -0,0 +1,23 @@ +-- DELIMITER $$ +-- CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION vn.client_getCurrency(vSelf INT) +-- RETURNS INT(3) +-- DETERMINISTIC +-- BEGIN +-- /** +-- * Devuelve la moneda por defecto del cliente dado +-- * +-- * @param vSelf id del cliente +-- * @return devuelve id del tipo de moneda +-- */ +-- DECLARE vCurrencyFk INT; + +-- SELECT co.currencyFk INTO vCurrencyFk +-- FROM client c +-- JOIN vn.province p ON p.id = c.provinceFk +-- JOIN vn.country co ON co.id = p.countryFk +-- WHERE c.id = vSelf +-- LIMIT 1; + +-- RETURN vCurrencyFk; +-- END$$ +-- DELIMITER ; diff --git a/db/routines/vn/functions/currency_getRate.sql b/db/routines/vn/functions/currency_getRate.sql index d3cbeceaa..96816e7e5 100644 --- a/db/routines/vn/functions/currency_getRate.sql +++ b/db/routines/vn/functions/currency_getRate.sql @@ -20,7 +20,7 @@ BEGIN SELECT value INTO vForeignRate FROM referenceRate WHERE dated = IFNULL(vDated, util.yesterday()) - AND id = vSelf + AND currencyFk = vSelf ORDER BY dated DESC LIMIT 1; diff --git a/db/routines/vn/procedures/orderCreate.sql b/db/routines/vn/procedures/orderCreate.sql index 87f98673b..9367f4cfe 100644 --- a/db/routines/vn/procedures/orderCreate.sql +++ b/db/routines/vn/procedures/orderCreate.sql @@ -3,23 +3,25 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`orderCreate`( vLanded DATE, vAgencyMode INT, vAddress INT, + vCompany INT, + vCurrency INT, vSourceApp VARCHAR(10), OUT vOrderId INT) BEGIN DECLARE vDeliveryMethod INT; DECLARE vClient INT; - + SELECT deliveryMethodFk INTO vDeliveryMethod - FROM vn.agencyMode + FROM vn.agencyMode WHERE id = vAgencyMode; - + SELECT clientFk INTO vClient FROM vn.address WHERE id = vAddress; - - INSERT INTO hedera.order(date_send,customer_id,delivery_method_id,agency_id,address_id,source_app) - VALUES( vLanded,vClient ,vDeliveryMethod,vAgencyMode ,vAddress ,vSourceApp); + + INSERT INTO hedera.order(date_send,customer_id,delivery_method_id,agency_id,address_id,company_id,currencyFk,source_app) + VALUES( vLanded,vClient ,vDeliveryMethod,vAgencyMode,vAddress,vCompany,vCurrency,vSourceApp); SET vOrderId = LAST_INSERT_ID(); diff --git a/db/routines/vn/procedures/orderListCreate.sql b/db/routines/vn/procedures/orderListCreate.sql index aa7d1284d..117aad91d 100644 --- a/db/routines/vn/procedures/orderListCreate.sql +++ b/db/routines/vn/procedures/orderListCreate.sql @@ -3,12 +3,14 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`orderListCreate`( vLanded DATE, vAgencyMode INT, vAddress INT, + vCompany INT, + vCurrency INT, vSourceApp VARCHAR(10)) BEGIN DECLARE vOrderId INT; - CALL vn.orderCreate(vLanded,vAgencyMode,vAddress,vSourceApp,vOrderId); + CALL vn.orderCreate(vLanded,vAgencyMode,vAddress,vCompany,vCurrency,vSourceApp,vOrderId); SELECT vOrderId; - + END$$ DELIMITER ; diff --git a/db/versions/11307-blackAralia/00-firstScript.sql b/db/versions/11307-blackAralia/00-firstScript.sql index 3b6a20ce6..6df0c8bfa 100644 --- a/db/versions/11307-blackAralia/00-firstScript.sql +++ b/db/versions/11307-blackAralia/00-firstScript.sql @@ -15,7 +15,7 @@ ALTER TABLE vn.company DROP FOREIGN KEY IF EXISTS company_currency_FK; ALTER TABLE vn.company ADD CONSTRAINT company_currency_FK FOREIGN KEY (currencyFk) REFERENCES vn.currency(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -ALTER TABLE vn.ticket ADD `currencyFk` tinyint(3) UNSIGNED DEFAULT 1 NOT NULL AFTER totalWithoutVat; +ALTER TABLE vn.ticket ADD `currencyFk` tinyint(3) UNSIGNED DEFAULT 1 NOT NULL AFTER totalWithoutVat; ALTER TABLE vn.ticket ADD `foreignTotalWithVat` decimal(10,2) NULL AFTER currencyFk; ALTER TABLE vn.ticket ADD `foreignTotalWithoutVat` decimal(10,2) NULL AFTER foreignTotalWithVat; @@ -52,3 +52,31 @@ FROM `hedera`.`orderRow` `t`; +ALTER TABLE vn.country ADD IF NOT EXISTS `companyFk` int(10) UNSIGNED DEFAULT 442 NOT NULL; +ALTER TABLE vn.country DROP FOREIGN KEY IF EXISTS country_defaultCompany_FK; +ALTER TABLE vn.country ADD CONSTRAINT country_defaultCompany_FK FOREIGN KEY (companyFk) + REFERENCES vn.company(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +ALTER TABLE vn.client ADD IF NOT EXISTS `defaultCompanyFk` int(10) UNSIGNED DEFAULT 442 NOT NULL; +ALTER TABLE vn.client ADD IF NOT EXISTS `defaultCurrencyFk` tinyint(3) UNSIGNED DEFAULT 1 NOT NULL; + + +ALTER TABLE vn.client DROP FOREIGN KEY IF EXISTS client_defaultCompany_FK; +ALTER TABLE vn.client DROP FOREIGN KEY IF EXISTS client_defaultCurrency_FK; + +ALTER TABLE vn.client ADD CONSTRAINT client_defaultCompany_FK FOREIGN KEY (defaultCompanyFk) + REFERENCES vn.company(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +ALTER TABLE vn.client ADD CONSTRAINT client_defaultCurrency_FK FOREIGN KEY (defaultCurrencyFk) + REFERENCES vn.currency(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; + +UPDATE vn.client c + JOIN vn.province p ON p.id = c.provinceFk + JOIN vn.country co ON co.id = p.countryFk + SET c.defaultCompanyFk = co.companyFk, + c.defaultCurrencyFk = co.currencyFk; + + + + + diff --git a/modules/client/back/models/client.json b/modules/client/back/models/client.json index f24f69ae7..08cba58c5 100644 --- a/modules/client/back/models/client.json +++ b/modules/client/back/models/client.json @@ -147,8 +147,13 @@ }, "hasDailyInvoice": { "type": "boolean" - } - + }, + "defaultCompanyFk": { + "type": "number" + }, + "defaultCurrencyFk": { + "type": "number" + } }, "relations": { "account": { @@ -256,7 +261,17 @@ "model": "Supplier", "foreignKey": "fi", "primaryKey": "nif" - } + }, + "currency": { + "type": "belongsTo", + "model": "Currency", + "foreignKey": "defaultCurrencyFk" + }, + "company": { + "type": "belongsTo", + "model": "Comapny", + "foreignKey": "defaultCompanyFk" + } }, "scopes": { "isActive": { diff --git a/modules/order/back/methods/order/catalogFilter.js b/modules/order/back/methods/order/catalogFilter.js index 27048457c..96caf29ea 100644 --- a/modules/order/back/methods/order/catalogFilter.js +++ b/modules/order/back/methods/order/catalogFilter.js @@ -92,11 +92,12 @@ module.exports = Self => { // Calculate items const order = await Self.findById(orderFk, null, myOptions); stmts.push(new ParameterizedSQL( - 'CALL vn.catalog_calculate(?, ?, ?, ?)', [ + 'CALL vn.catalog_calculate(?, ?, ?, ?, ?)', [ order.landed, order.address_id, order.agency_id, - false + order.currencyFk, + false, ] )); @@ -119,7 +120,9 @@ module.exports = Self => { w.firstName, tci.priceKg, ink.hex, - tci.minQuantity + tci.minQuantity, + tci.foreignPrice, + tci.foreignPriceKg FROM tmp.ticketCalculateItem tci JOIN vn.item i ON i.id = tci.itemFk JOIN vn.itemType it ON it.id = i.typeFk @@ -161,9 +164,11 @@ module.exports = Self => { `SELECT tcp.itemFk, tcp.grouping, tcp.price, + tcp.foreignPrice, tcp.rate, tcp.warehouseFk, tcp.priceKg, + tcp.foreignPriceKg, w.name warehouse FROM tmp.ticketComponentPrice tcp JOIN vn.warehouse w ON w.id = tcp.warehouseFk`) - 1; diff --git a/modules/order/back/methods/order/getItemTypeAvailable.js b/modules/order/back/methods/order/getItemTypeAvailable.js index fd7be5d57..d9eacbeed 100644 --- a/modules/order/back/methods/order/getItemTypeAvailable.js +++ b/modules/order/back/methods/order/getItemTypeAvailable.js @@ -62,11 +62,12 @@ module.exports = Self => { stmts.push(stmt); stmt = new ParameterizedSQL( - 'CALL vn.catalog_calculate(?, ?, ?, ?)', [ + 'CALL vn.catalog_calculate(?, ?, ?, ?, ?)', [ order.landed, order.addressFk, order.agencyModeFk, - false + order.currencyFk, + false, ] ); stmts.push(stmt); diff --git a/modules/order/back/methods/order/getTotal.js b/modules/order/back/methods/order/getTotal.js index 0404a1e96..a1873d15b 100644 --- a/modules/order/back/methods/order/getTotal.js +++ b/modules/order/back/methods/order/getTotal.js @@ -10,7 +10,7 @@ module.exports = Self => { http: {source: 'path'} }], returns: { - type: 'number', + type: 'object', root: true }, http: { @@ -25,9 +25,22 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const query = `SELECT hedera.order_getTotal(?) total;`; - const [total] = await Self.rawSql(query, [orderFk], myOptions); + const query = ` + DROP TEMPORARY TABLE IF EXISTS tmp.order; + CREATE TEMPORARY TABLE tmp.order + ENGINE = MEMORY + SELECT ? orderFk; - return total.total; + CALL hedera.order_getTotal; + SELECT total, foreignTotal FROM tmp.orderTotal; + + DROP TEMPORARY TABLE + tmp.order, + tmp.orderTotal;`; + + const totals = await Self.rawSql(query, [orderFk], myOptions); + const INDEX_QUERY = 3; + + return totals[INDEX_QUERY][0]; }; }; diff --git a/modules/order/back/methods/order/getVAT.js b/modules/order/back/methods/order/getVAT.js index 6bc0bd1b6..2080a622b 100644 --- a/modules/order/back/methods/order/getVAT.js +++ b/modules/order/back/methods/order/getVAT.js @@ -10,7 +10,7 @@ module.exports = Self => { http: {source: 'path'} }], returns: { - type: 'number', + type: 'object', root: true }, http: { @@ -25,12 +25,19 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - let totalTax = 0.00; + let vat = 0.00; + let foreignVat = 0.00; const taxes = await Self.app.models.Order.getTaxes(orderId, myOptions); + taxes.forEach(tax => { - totalTax += tax.tax; + vat += tax.tax; + foreignVat += tax.foreignTax; }); - return Math.round(totalTax * 100) / 100; + return {vat: round(vat), foreignVat: round(foreignVat)}; }; + + function round(amount) { + return Math.round(amount * 100) / 100; + } }; diff --git a/modules/order/back/methods/order/new.js b/modules/order/back/methods/order/new.js index 2aad27c9a..685755843 100644 --- a/modules/order/back/methods/order/new.js +++ b/modules/order/back/methods/order/new.js @@ -20,6 +20,16 @@ module.exports = Self => { description: 'The agencyMode for the order', type: 'number', required: true + }, { + arg: 'companyId', + description: 'The company for the order', + type: 'number', + required: true + }, { + arg: 'currencyId', + description: 'The currency for the order', + type: 'number', + required: true } ], returns: { @@ -32,7 +42,7 @@ module.exports = Self => { } }); - Self.new = async(ctx, landed, addressId, agencyModeId, options) => { + Self.new = async(ctx, landed, addressId, agencyModeId, companyId, currencyId, options) => { const myOptions = {userId: ctx.req.accessToken.userId}; let tx; @@ -59,11 +69,13 @@ module.exports = Self => { throw new UserError(`You can't create an order for an inactive client`); } - query = `CALL vn.orderListCreate(?, ?, ?, ?);`; + query = `CALL vn.orderListCreate(?, ?, ?, ?, ?, ?);`; [result] = await Self.rawSql(query, [ landed, agencyModeId, addressId, + companyId, + currencyId, 'SALIX' ], myOptions); diff --git a/modules/order/back/methods/order/updateBasicData.js b/modules/order/back/methods/order/updateBasicData.js index 5104db87f..c78b49c2c 100644 --- a/modules/order/back/methods/order/updateBasicData.js +++ b/modules/order/back/methods/order/updateBasicData.js @@ -57,6 +57,8 @@ module.exports = Self => { 'landed', 'agencyModeFk', 'note', + 'companyFk', + 'currencyFk', ]); if (Object.keys(updateParams).length) await order.updateAttributes(updateParams, myOptions); diff --git a/modules/order/back/models/order-row.json b/modules/order/back/models/order-row.json index 4b78bfdad..7fe427e49 100644 --- a/modules/order/back/models/order-row.json +++ b/modules/order/back/models/order-row.json @@ -30,6 +30,9 @@ "price": { "type": "number" }, + "foreignPrice": { + "type": "number" + }, "rate": { "type": "number" }, diff --git a/modules/order/back/models/order.json b/modules/order/back/models/order.json index 169c0c550..b5e64a5af 100644 --- a/modules/order/back/models/order.json +++ b/modules/order/back/models/order.json @@ -82,6 +82,9 @@ }, "total": { "type": "number" + }, + "currencyFk": { + "type": "number" } }, "relations": { @@ -114,6 +117,11 @@ "type": "belongsTo", "model": "Company", "foreignKey": "company_id" + }, + "currency": { + "type": "belongsTo", + "model": "Currency", + "foreignKey": "currencyFk" } } }