diff --git a/Jenkinsfile b/Jenkinsfile index bd19e8e15..56e33f4ae 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,34 +5,44 @@ def FROM_GIT def RUN_TESTS def RUN_BUILD -pre: { - switch (env.BRANCH_NAME) { - case 'test': - env.NODE_ENV = 'test' - env.BACK_REPLICAS = 2 - break - case 'master': - env.NODE_ENV = 'production' - env.BACK_REPLICAS = 4 - break - default: - env.NODE_ENV = 'dev' - env.BACK_REPLICAS = 1 +node { + stage('Setup') { + env.NODE_ENV = 'dev' + + PROTECTED_BRANCH = [ + 'dev', + 'test', + 'master' + ].contains(env.BRANCH_NAME) + + FROM_GIT = env.JOB_NAME.startsWith('gitea/') + RUN_TESTS = !PROTECTED_BRANCH && FROM_GIT + RUN_BUILD = PROTECTED_BRANCH && FROM_GIT + + // https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables + echo "NODE_NAME: ${env.NODE_NAME}" + echo "WORKSPACE: ${env.WORKSPACE}" + + configFileProvider([ + configFile(fileId: 'salix.properties', + variable: 'PROPS_FILE') + ]) { + def props = readProperties file: PROPS_FILE + props.each {key, value -> env."${key}" = value } + props.each {key, value -> echo "${key}: ${value}" } + } + + if (PROTECTED_BRANCH) { + configFileProvider([ + configFile(fileId: "salix.branch.${env.BRANCH_NAME}", + variable: 'BRANCH_PROPS_FILE') + ]) { + def props = readProperties file: BRANCH_PROPS_FILE + props.each {key, value -> env."${key}" = value } + props.each {key, value -> echo "${key}: ${value}" } + } + } } - - PROTECTED_BRANCH = [ - 'dev', - 'test', - 'master' - ].contains(env.BRANCH_NAME) - - FROM_GIT = env.JOB_NAME.startsWith('gitea/') - RUN_TESTS = !PROTECTED_BRANCH && FROM_GIT - RUN_BUILD = PROTECTED_BRANCH && FROM_GIT - - // Uncomment to enable debugging - // https://loopback.io/doc/en/lb3/Setting-debug-strings.html#debug-strings-reference - //env.DEBUG = 'strong-remoting:shared-method' } pipeline { agent any @@ -47,29 +57,47 @@ pipeline { STACK_NAME = "${env.PROJECT_NAME}-${env.BRANCH_NAME}" } stages { + stage('Install') { + environment { + NODE_ENV = '' + } + parallel { + stage('Back') { + steps { + sh 'pnpm install --prefer-offline' + } + } + stage('Print') { + when { + expression { FROM_GIT } + } + steps { + sh 'pnpm install --prefer-offline --prefix=print' + } + } + stage('Front') { + when { + expression { FROM_GIT } + } + steps { + sh 'pnpm install --prefer-offline --prefix=front' + } + } + } + } stage('Stack') { environment { - NODE_ENV = "" TZ = 'Europe/Madrid' } parallel { stage('Back') { stages { - stage('Install') { - environment { - NODE_ENV = "" - } - steps { - sh 'pnpm install --prefer-offline' - sh 'pnpm install --prefer-offline --prefix=print' - } - } stage('Test') { when { expression { RUN_TESTS } } environment { - NODE_ENV = "" + NODE_ENV = '' } steps { sh 'npm run test:back:ci' @@ -106,20 +134,12 @@ pipeline { expression { FROM_GIT } } stages { - stage('Install') { - environment { - NODE_ENV = "" - } - steps { - sh 'pnpm install --prefer-offline --prefix=front' - } - } stage('Test') { when { expression { RUN_TESTS } } environment { - NODE_ENV = "" + NODE_ENV = '' } steps { sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=10' diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index dc29945fb..2bcdd84aa 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -73,9 +73,10 @@ INSERT INTO vn.cmr (id, truckPlate, observations, senderInstruccions, paymentIns UPDATE `vn`.`claimRatio` SET `claimAmount` = '10' WHERE (`clientFk` = '1101'); -INSERT INTO `vn`.`agency` (`name`, `warehouseFk`, `warehouseAliasFk`, `isOwn`, `isAnyVolumeAllowed`) VALUES - ('Agencia', '1', '1', '1', '1'), - ('Otra agencia ', '1', '2', '0', '0'); +INSERT INTO `vn`.`agency` (`name`, `warehouseFk`, `isOwn`, `isAnyVolumeAllowed`) + VALUES + ('Agencia', '1', '1', '1'), + ('Otra agencia ', '1', '0', '0'); INSERT INTO `vn`.`expedition` (`agencyModeFk`, `ticketFk`, `isBox`, `counter`, `workerFk`, `externalId`, `packagingFk`, `hostFk`, `itemPackingTypeFk`, `hasNewRoute`) VALUES ('1', '1', 1, '1', '1', '1', '1', 'pc00', 'F', 0), diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 3803730bd..ae7612b46 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -174,20 +174,15 @@ INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, (19,'Francia', 1, 'FR', 1, 27, 4, 0, 1), (30,'Canarias', 1, 'IC', 1, 24, 4, 1, 2); -INSERT INTO `vn`.`warehouseAlias`(`id`, `name`) +INSERT INTO `vn`.`warehouse`(`id`, `name`, `code`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasDms`, `hasComission`, `countryFk`, `hasProduction`, `isOrigin`, `isDestiny`) VALUES - (1, 'Main Warehouse'), - (2, 'Gotham'); - -INSERT INTO `vn`.`warehouse`(`id`, `name`, `code`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasDms`, `hasComission`, `aliasFk`, `countryFk`, `hasProduction`) - VALUES - (1, 'Warehouse One', 'ALG', 1, 1, 1, 1, 1, 1, 2, 1, 1), - (2, 'Warehouse Two', NULL, 1, 1, 1, 1, 0, 1, 2, 13, 1), - (3, 'Warehouse Three', NULL, 1, 1, 1, 1, 0, 0, 2, 1, 1), - (4, 'Warehouse Four', NULL, 1, 1, 1, 1, 0, 0, 2, 1, 1), - (5, 'Warehouse Five', NULL, 1, 1, 1, 1, 0, 0, 2, 1, 1), - (13, 'Inventory', 'inv', 1, 1, 1, 0, 0, 0, 2, 1, 0), - (60, 'Algemesi', NULL, 1, 1, 1, 0, 0, 0, 2, 1, 0); + (1, 'Warehouse One', 'ALG', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), + (2, 'Warehouse Two', NULL, 1, 1, 1, 1, 0, 1, 13, 1, 1, 0), + (3, 'Warehouse Three', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0), + (4, 'Warehouse Four', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1), + (5, 'Warehouse Five', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0), + (13, 'Inventory', 'inv', 1, 1, 1, 0, 0, 0, 1, 0, 0, 0), + (60, 'Algemesi', NULL, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0); INSERT INTO `vn`.`sectorType` (id,description) VALUES (1,'First type'); @@ -271,18 +266,18 @@ INSERT INTO `vn`.`deliveryMethod`(`id`, `code`, `description`) (3, 'PICKUP', 'Recogida'), (4, 'OTHER', 'Otros'); -INSERT INTO `vn`.`agency`(`id`, `name`, `warehouseFk`, `warehouseAliasFk`) +INSERT INTO `vn`.`agency`(`id`, `name`, `warehouseFk`) VALUES - (1, 'inhouse pickup' , 1, 1), - (2, 'Super-Man delivery' , 1, 1), - (3, 'Teleportation device' , 1, 1), - (4, 'Entanglement' , 1, 1), - (5, 'Quantum break device' , 1, 1), - (6, 'Walking' , 1, 1), - (7, 'Gotham247' , 1, 1), - (8, 'Gotham247Expensive' , 1, 1), - (9, 'Refund' , 1, 1), - (10, 'Other agency' , 1, 1); + (1, 'inhouse pickup' , 1), + (2, 'Super-Man delivery' , 1), + (3, 'Teleportation device' , 1), + (4, 'Entanglement' , 1), + (5, 'Quantum break device' , 1), + (6, 'Walking' , 1), + (7, 'Gotham247' , 1), + (8, 'Gotham247Expensive' , 1), + (9, 'Refund' , 1), + (10, 'Other agency' , 1); UPDATE `vn`.`agencyMode` SET `id` = 1 WHERE `name` = 'inhouse pickup'; UPDATE `vn`.`agencyMode` SET `id` = 2 WHERE `name` = 'Super-Man delivery'; @@ -569,13 +564,13 @@ INSERT INTO `vn`.`supplierActivity`(`code`, `name`) INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif`, `commission`, `created`, `isActive`, `street`, `city`, `provinceFk`, `postCode`, `payMethodFk`, `payDemFk`, `payDay`, `taxTypeSageFk`, `withholdingSageFk`, `transactionTypeSageFk`, `workerFk`, `supplierActivityFk`, `isPayMethodChecked`, `healthRegister`) VALUES - (1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), - (2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), - (69, 'Packaging', 'Packaging nick', 4100000069, 1, '94935005K', 0, util.VN_CURDATE(), 1, 'supplier address 5', 'ASGARD', 3, 46600, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), - (442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), - (567, 'Holland', 'Holland nick', 4000020567, 1, '14364089Z', 0, util.VN_CURDATE(), 1, 'supplier address 6', 'ASGARD', 3, 46600, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), - (791, 'Bros SL', 'Bros nick', 5115000791, 1, '37718083S', 0, util.VN_CURDATE(), 1, 'supplier address 7', 'ASGARD', 3, 46600, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), - (1381, 'Ornamentales', 'Ornamentales', 7185001381, 1, '07972486L', 0, util.VN_CURDATE(), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'); + (1, 'PLANTS SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), + (2, 'FARMER KING', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), + (69, 'PACKAGING', 'Packaging nick', 4100000069, 1, '94935005K', 0, util.VN_CURDATE(), 1, 'supplier address 5', 'ASGARD', 3, 46600, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), + (442, 'VERDNATURA LEVANTE SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), + (567, 'HOLLAND', 'Holland nick', 4000020567, 1, '14364089Z', 0, util.VN_CURDATE(), 1, 'supplier address 6', 'ASGARD', 3, 46600, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), + (791, 'BROS SL', 'Bros nick', 5115000791, 1, '37718083S', 0, util.VN_CURDATE(), 1, 'supplier address 7', 'ASGARD', 3, 46600, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), + (1381, 'ORNAMENTALES', 'Ornamentales', 7185001381, 1, '07972486L', 0, util.VN_CURDATE(), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'); INSERT INTO `vn`.`supplierAddress`(`id`, `supplierFk`, `nickname`, `street`, `provinceFk`, `postalCode`, `city`, `phone`, `mobile`) VALUES diff --git a/db/routines/bs/procedures/comercialesCompleto.sql b/db/routines/bs/procedures/comercialesCompleto.sql index 323d5cd00..2b8019175 100644 --- a/db/routines/bs/procedures/comercialesCompleto.sql +++ b/db/routines/bs/procedures/comercialesCompleto.sql @@ -20,16 +20,16 @@ BEGIN c.movil, c.POBLACION poblacion, p.`name` provincia, - vn2008.red(f.futur) futur, + ROUND(f.futur, 2) futur, c.Credito credito, pm.`name` forma_pago, - vn2008.red(c365 / 12) consumo_medio365, - vn2008.red(c365) consumo365, - vn2008.red(CmLy.peso) peso_mes_año_pasado, - vn2008.red(CmLy.peso * 1.19) objetivo, + ROUND(c365 / 12, 2) consumo_medio365, + ROUND(c365, 2) consumo365, + ROUND(CmLy.peso, 2) peso_mes_año_pasado, + ROUND(CmLy.peso * 1.19, 2) objetivo, tr.CodigoTrabajador, - vn2008.red(mes_actual.consumo) consumoMes, - vn2008.red(IFNULL(mes_actual.consumo, 0) - IFNULL(CmLy.peso * 1.19, 0)) como_lo_llevo, + ROUND(mes_actual.consumo, 2) consumoMes, + ROUND(IFNULL(mes_actual.consumo, 0) - IFNULL(CmLy.peso * 1.19, 0), 2) como_lo_llevo, DATE(LastTicket) ultimo_ticket, dead.muerto, g.Greuge, diff --git a/db/routines/vn/functions/intrastat_estimateNet.sql b/db/routines/vn/functions/intrastat_estimateNet.sql new file mode 100644 index 000000000..350cb788a --- /dev/null +++ b/db/routines/vn/functions/intrastat_estimateNet.sql @@ -0,0 +1,32 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`intrastat_estimateNet`( + vSelf INT, + vStems INT +) + RETURNS double + DETERMINISTIC +BEGIN +/** +* Calcula un valor neto estimado en función de +* datos históricos de facturas intrastat. +* +* @param vSelf Id de intrastat +* @param vStems Número de unidades +* @return vNet +*/ + DECLARE vNet DOUBLE; + + SELECT ROUND(vStems / (SUM(average) / COUNT(average)), 2) INTO vNet + FROM ( + SELECT *, stems / net average + FROM invoiceInIntrastat + WHERE intrastatFk = vSelf + AND net + AND stems > 0 + ORDER BY dated DESC + LIMIT 20 + ) sub; + + RETURN vNet/2; +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/procedures/fustControl.sql b/db/routines/vn/procedures/fustControl.sql deleted file mode 100644 index 506354b20..000000000 --- a/db/routines/vn/procedures/fustControl.sql +++ /dev/null @@ -1,79 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`fustControl`(vFromDated DATE, vToDated DATE) -BEGIN - - DECLARE vSijsnerClientFk INT DEFAULT 19752; - - DECLARE vDateStart DATETIME; - DECLARE vDateEnd DATETIME; - - SET vDateStart = vFromDated; - SET vDateEnd = util.Dayend(vToDated); - - SELECT p.id FustCode, - CAST(sent.stucks AS DECIMAL(10,0)) FH, - CAST(tp.stucks AS DECIMAL(10,0)) Tickets, - CAST(-sj.stucks AS DECIMAL(10,0)) Sijsner, - CAST(IFNULL(sent.stucks,0) - IFNULL(tp.stucks,0) + IFNULL(sj.stucks,0) AS DECIMAL(10,0)) saldo - FROM vn.packaging p - LEFT JOIN ( - SELECT FustCode, sum(fustQuantity) stucks - FROM ( - SELECT IFNULL(pe.equivalentFk ,b.packagingFk) FustCode, s.quantity / b.packing AS fustQuantity - FROM vn.sale s - JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.warehouse w ON w.id = t.warehouseFk - JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk - JOIN cache.last_buy lb ON lb.item_id = s.itemFk AND lb.warehouse_id = t.warehouseFk - JOIN vn.buy b ON b.id = lb.buy_id - JOIN vn.packaging p ON p.id = b.packagingFk - LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.province p2 ON p2.id = a.provinceFk - JOIN vn.country c ON c.id = p2.countryFk - WHERE t.shipped BETWEEN vDateStart AND vDateEnd - AND wa.name = 'VNH' - AND p.isPackageReturnable - AND c.country = 'FRANCIA') sub - GROUP BY FustCode) sent ON sent.FustCode = p.id - LEFT JOIN ( - SELECT FustCode, sum(quantity) stucks - FROM ( - SELECT IFNULL(pe.equivalentFk ,tp.packagingFk) FustCode, tp.quantity - FROM vn.ticketPackaging tp - JOIN vn.ticket t ON t.id = tp.ticketFk - JOIN vn.warehouse w ON w.id = t.warehouseFk - JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk - JOIN vn.packaging p ON p.id = tp.packagingFk - LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.province p2 ON p2.id = a.provinceFk - JOIN vn.country c ON c.id = p2.countryFk - WHERE t.shipped BETWEEN vDateStart AND vDateEnd - AND wa.name = 'VNH' - AND p.isPackageReturnable - AND c.country = 'FRANCIA' - AND t.clientFk != vSijsnerClientFk - AND tp.quantity > 0) sub - GROUP BY FustCode) tp ON tp.FustCode = p.id - LEFT JOIN ( - SELECT FustCode, sum(quantity) stucks - FROM ( - SELECT IFNULL(pe.equivalentFk ,tp.packagingFk) FustCode, tp.quantity - FROM vn.ticketPackaging tp - JOIN vn.ticket t ON t.id = tp.ticketFk - JOIN vn.warehouse w ON w.id = t.warehouseFk - JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk - JOIN vn.packaging p ON p.id = tp.packagingFk - LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id - WHERE t.shipped BETWEEN TIMESTAMPADD(DAY, 1, vDateStart ) AND TIMESTAMPADD(DAY, 1, vDateEnd ) - AND wa.name = 'VNH' - AND p.isPackageReturnable - AND t.clientFk = vSijsnerClientFk) sub - GROUP BY FustCode) sj ON sj.FustCode = p.id - WHERE sent.stucks - OR tp.stucks - OR sj.stucks; - -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/fustControlDetail.sql b/db/routines/vn/procedures/fustControlDetail.sql deleted file mode 100644 index a48a3531b..000000000 --- a/db/routines/vn/procedures/fustControlDetail.sql +++ /dev/null @@ -1,36 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`fustControlDetail`(vFromDated DATE, vToDated DATE) -BEGIN - - DECLARE vSijsnerClientFk INT DEFAULT 19752; - - DECLARE vDateStart DATETIME; - DECLARE vDateEnd DATETIME; - - SET vDateStart = vFromDated; - SET vDateEnd = util.Dayend(vToDated); - - SELECT a.nickname shopName, - a.city , - IFNULL(pe.equivalentFk ,tp.packagingFk) FustCode, - tp.quantity, - tp.ticketFk, - CONCAT('From ', vFromDated,' to ', vToDated) AS dateRange - FROM vn.ticketPackaging tp - JOIN vn.ticket t ON t.id = tp.ticketFk - JOIN vn.warehouse w ON w.id = t.warehouseFk - JOIN vn.warehouseAlias wa ON wa.id = w.aliasFk - JOIN vn.packaging p ON p.id = tp.packagingFk - LEFT JOIN vn.packageEquivalent pe ON pe.packagingFk = p.id - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.province p2 ON p2.id = a.provinceFk - JOIN vn.country c ON c.id = p2.countryFk - WHERE t.shipped BETWEEN vFromDated AND util.dayend(vToDated) - AND wa.name = 'VNH' - AND p.isPackageReturnable - AND c.country = 'FRANCIA' - AND t.clientFk != vSijsnerClientFk - AND tp.quantity > 0; - -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/invoiceIn_add.sql b/db/routines/vn/procedures/invoiceIn_add.sql new file mode 100644 index 000000000..0898d6810 --- /dev/null +++ b/db/routines/vn/procedures/invoiceIn_add.sql @@ -0,0 +1,234 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `sage`.`invoiceIn_add`(vInvoiceInFk INT, vXDiarioFk INT) +BEGIN +/** + * Traslada la info de contabilidad relacionada con las facturas recibidas + * + * @vInvoiceInFk Factura recibida + * @vXDiarioFk Id tabla XDiario + */ + DECLARE vInvoiceInOriginalFk INT; + DECLARE vDone BOOL DEFAULT FALSE; + DECLARE vBase DOUBLE; + DECLARE vVat DOUBLE; + DECLARE vRate DOUBLE; + DECLARE vTransactionCode INT; + DECLARE vCounter INT DEFAULT 0; + DECLARE vTransactionCodeOld INT; + DECLARE vTaxCode INT; + DECLARE vTaxCodeOld INT; + DECLARE vOperationCode VARCHAR(1); + DECLARE vIsIntracommunity BOOL DEFAULT FALSE; + DECLARE vSerialDua VARCHAR(1) DEFAULT 'D'; + DECLARE vInvoiceTypeReceived VARCHAR(1); + DECLARE vInvoiceTypeInformative VARCHAR(1); + DECLARE vIsInformativeExportation BOOL DEFAULT FALSE; + + DECLARE vCursor CURSOR FOR + SELECT it.taxableBase, + CAST((( it.taxableBase / 100) * t.PorcentajeIva) AS DECIMAL (10,2)), + t.PorcentajeIva, + it.transactionTypeSageFk, + it.taxTypeSageFk, + tty.isIntracommunity, + tt.ClaveOperacionDefecto + FROM vn.invoiceIn i + JOIN vn.invoiceInTax it ON it.InvoiceInFk = i.id + JOIN TiposIva t ON t.CodigoIva = it.taxTypeSageFk + JOIN taxType tty ON tty.id = t.CodigoIva + JOIN TiposTransacciones tt ON tt.CodigoTransaccion = it.transactionTypeSageFk + LEFT JOIN vn.dua d ON d.id = vInvoiceInFk + WHERE i.id = vInvoiceInFk + AND d.id IS NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + + DELETE FROM movContaIVA + WHERE id = vXDiarioFk; + + SELECT codeSage INTO vInvoiceTypeReceived + FROM invoiceType WHERE code ='received'; + + SELECT codeSage INTO vInvoiceTypeInformative + FROM invoiceType WHERE code ='informative'; + + INSERT INTO movContaIVA(id, LibreA1) + VALUES (vXDiarioFk, vInvoiceInFk); + + OPEN vCursor; + + l: LOOP + FETCH vCursor INTO vBase, + vVat, + vRate, + vTransactionCode, + vTaxCode, + vIsIntracommunity, + vOperationCode; + + IF vDone THEN + LEAVE l; + END IF; + + SET vTransactionCodeOld = vTransactionCode; + SET vTaxCodeOld = vTaxCode; + + IF vOperationCode IS NOT NULL THEN + UPDATE movContaIVA + SET ClaveOperacionFactura = vOperationCode + WHERE id = vXDiarioFk; + END IF; + + SET vCounter = vCounter + 1; + CASE vCounter + WHEN 1 THEN + UPDATE movContaIVA + SET BaseIva1 = vBase, + PorIva1 = vRate, + CuotaIva1 = vVat, + CodigoTransaccion1 = vTransactionCode, + CodigoIva1 = vTaxCode + WHERE id = vXDiarioFk; + + WHEN 2 THEN + UPDATE movContaIVA + SET BaseIva2 = vBase, + PorIva2 = vRate, + CuotaIva2 = vVat, + CodigoTransaccion2 = vTransactionCode, + CodigoIva2 = vTaxCode + WHERE id = vXDiarioFk; + WHEN 3 THEN + UPDATE movContaIVA + SET BaseIva3 = vBase, + PorIva3 = vRate, + CuotaIva3 = vVat, + CodigoTransaccion3 = vTransactionCode, + CodigoIva3 = vTaxCode + WHERE id = vXDiarioFk; + WHEN 4 THEN + UPDATE movContaIVA + SET BaseIva4 = vBase, + PorIva4 = vRate, + CuotaIva4 = vVat, + CodigoTransaccion4 = vTransactionCode, + CodigoIva4 = vTaxCode + WHERE id = vXDiarioFk; + ELSE + SELECT vXDiarioFk INTO vXDiarioFk; + END CASE; + + IF vIsIntracommunity THEN + UPDATE movContaIVA + SET Intracomunitaria = TRUE + WHERE id = vXDiarioFk; + END IF; + + SET vTransactionCodeOld = vTransactionCode; + SET vTaxCodeOld = vTaxCode; + + END LOOP; + + CLOSE vCursor; + + SELECT d.ASIEN AND x.ASIEN IS NULL INTO vIsInformativeExportation + FROM vn.dua d + LEFT JOIN vn.XDiario x ON x.ASIEN = d.ASIEN + AND x.SERIE = vSerialDua COLLATE utf8mb3_unicode_ci + WHERE d.ASIEN = ( + SELECT ASIEN + FROM vn.XDiario + WHERE id = vXDiarioFk) + LIMIT 1; + + UPDATE movContaIVA mci + JOIN tmp.invoiceIn ii ON ii.id = vInvoiceInFk + JOIN vn.XDiario x ON x.id = mci.id + LEFT JOIN tmp.invoiceDua id ON id.id = mci.id + JOIN vn.supplier s ON s.id = ii.supplierFk + JOIN Naciones n ON n.countryFk = s.countryFk + SET mci.CodigoDivisa = ii.currencyFk, + mci.Año = YEAR(ii.issued), + mci.Serie = ii.serial, + mci.Factura = ii.id, + mci.FechaFactura = ii.issued, + mci.ImporteFactura = IFNULL(mci.BaseIva1, 0) + IFNULL(mci.CuotaIva1, 0) + + IFNULL(mci.BaseIva2, 0) + IFNULL(mci.CuotaIva2, 0) + + IFNULL(mci.BaseIva3, 0) + IFNULL(mci.CuotaIva3, 0) + + IFNULL(mci.BaseIva4, 0) + IFNULL(mci.CuotaIva4, 0), + mci.TipoFactura = IF(id.id, + IF( ii.serial = vSerialDua COLLATE utf8mb3_unicode_ci, vInvoiceTypeReceived, vInvoiceTypeInformative), + IF(vIsInformativeExportation,vInvoiceTypeInformative, vInvoiceTypeReceived)), + mci.CodigoCuentaFactura = x.SUBCTA, + mci.CifDni = IF(LEFT(TRIM(s.nif), 2) = n.SiglaNacion, SUBSTRING(TRIM(s.nif), 3), s.nif), + mci.Nombre = s.name, + mci.SiglaNacion = n.SiglaNacion, + mci.EjercicioFactura = YEAR(ii.issued), + mci.FechaOperacion = ii.issued, + mci.MantenerAsiento = TRUE, + mci.SuFacturaNo = ii.supplierRef, + mci.IvaDeducible1 = IF(id.id, FALSE, IF(IFNULL(mci.BaseIva1, FALSE) = FALSE, FALSE, ii.isVatDeductible)), + mci.IvaDeducible2 = IF(id.id, FALSE, IF(IFNULL(mci.BaseIva2, FALSE) = FALSE, FALSE, ii.isVatDeductible)), + mci.IvaDeducible3 = IF(id.id, FALSE, IF(IFNULL(mci.BaseIva3, FALSE) = FALSE, FALSE, ii.isVatDeductible)), + mci.IvaDeducible4 = IF(id.id, FALSE, IF(IFNULL(mci.BaseIva4, FALSE) = FALSE, FALSE, ii.isVatDeductible)), + mci.FechaFacturaOriginal = x.FECHA_EX + WHERE mci.id = vXDiarioFk; + + -- RETENCIONES + UPDATE movContaIVA mci + JOIN vn.invoiceIn ii ON ii.id = vInvoiceInFk + JOIN vn.XDiario x ON x.id = mci.id + JOIN vn.supplier s ON s.id = supplierFk + JOIN vn.invoiceInTax iit ON iit.invoiceInFk = ii.id + JOIN vn.expense e ON e.id = iit.expenseFk + JOIN TiposRetencion t ON t.CodigoRetencion = ii.withholdingSageFk + LEFT JOIN tmp.invoiceDua id ON id.id = mci.id + JOIN (SELECT SUM(x2.BASEEURO) taxableBase, SUM(x2.EURODEBE) taxBase + FROM vn.XDiario x1 + JOIN vn.XDiario x2 ON x1.ASIEN = x2.ASIEN + WHERE x2.BASEEURO <> 0 + AND x1.id = vXDiarioFk + )sub + JOIN ClavesOperacion co ON co.Descripcion = 'Arrendamiento de locales de negocio' + SET mci.CodigoRetencion = t.CodigoRetencion, + mci.ClaveOperacionFactura = IF( t.Retencion = 'ARRENDAMIENTO Y SUBARRENDAMIENTO', co.ClaveOperacionFactura_, mci.ClaveOperacionFactura), + mci.BaseRetencion = IF (t.Retencion = 'ACTIVIDADES AGRICOLAS O GANADERAS', sub.taxableBase + sub.taxBase, sub.taxableBase), + mci.PorRetencion = t.PorcentajeRetencion, + mci.ImporteRetencion = iit.taxableBase * - 1 + WHERE mci.id = vXDiarioFk + AND e.name = 'Retenciones' + AND id.id IS NULL; + + SELECT correctedFk INTO vInvoiceInOriginalFk + FROM vn.invoiceInCorrection + WHERE correctingFk = vInvoiceInFk; + + IF vInvoiceInOriginalFk THEN + + UPDATE movContaIVA mci + JOIN vn.invoiceInRefund iir ON iir.invoiceInRefundFk = vInvoiceInFk + JOIN (SELECT issued, + SUM(sub.taxableBase) taxableBase, + SUM(ROUND((sub.taxableBase * sub.PorcentajeIva) / 100 , 2)) vat + FROM(SELECT issued, + SUM(iit.taxableBase) taxableBase, + ti.PorcentajeIva + FROM vn.invoiceIn i + JOIN vn.invoiceInTax iit ON iit.invoiceInFk = i.id + JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk + WHERE i.id = vInvoiceInOriginalFk + GROUP BY ti.CodigoIva)sub + )invoiceInOriginal + JOIN ClavesOperacion co ON co.Descripcion = 'Factura rectificativa' + SET mci.TipoRectificativa = iir.refundCategoryFk, + mci.ClaseAbonoRectificativas = iir.refundType, + mci.FechaFacturaOriginal = invoiceInOriginal.issued, + mci.FechaOperacion = invoiceInOriginal.issued, + mci.BaseImponibleOriginal = invoiceInOriginal.taxableBase, + mci.CuotaIvaOriginal = invoiceInOriginal.vat, + mci.ClaveOperacionFactura = co.ClaveOperacionFactura_ + WHERE mci.id = vXDiarioFk; + + END IF; +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql index 424e3438d..bdc13ae9d 100644 --- a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql +++ b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql @@ -8,27 +8,22 @@ BEGIN * @param vItemFk Identificador de vn.item * @param vSectorFk Identificador de vn.sector */ - DECLARE vWarehouseAliasFk INT; - - SELECT w.aliasFk INTO vWarehouseAliasFk - FROM vn.sector s - JOIN vn.warehouse w ON w.id = s.warehouseFk - WHERE s.id = vSectorFk; - SELECT ish.shelvingFk shelving, - p.code parking, - sum(ish.visible) as stockTotal, - ish.created, - p.pickingOrder + p.code parking, + SUM(ish.visible) stockTotal, + ish.created, + p.pickingOrder FROM vn.itemShelving ish JOIN vn.shelving sh ON sh.code = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector sc ON sc.id = p.sectorFk JOIN vn.warehouse w ON w.id = sc.warehouseFk - WHERE w.aliasFk = vWarehouseAliasFk - AND ish.visible > 0 - AND ish.itemFk = vItemFk + WHERE sc.id = vSectorFk + AND ish.visible > 0 + AND ish.itemFk = vItemFk GROUP BY ish.id - ORDER BY (sc.id = vSectorFk) DESC, sh.priority DESC, ish.created, p.pickingOrder; + ORDER BY sh.priority DESC, + ish.created, + p.pickingOrder; END$$ -DELIMITER ; +DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/procedures/itemShelvingRadar.sql b/db/routines/vn/procedures/itemShelvingRadar.sql index 778bd9910..c860d239e 100644 --- a/db/routines/vn/procedures/itemShelvingRadar.sql +++ b/db/routines/vn/procedures/itemShelvingRadar.sql @@ -1,7 +1,13 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingRadar`(vSectorFk INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingRadar`( + vSectorFk INT +) proc:BEGIN - +/** + * Calcula la información detallada respecto un sector. + * + * @param vSectorFk Id de sector + */ DECLARE vCalcVisibleFk INT; DECLARE vCalcAvailableFk INT; DECLARE hasFatherSector BOOLEAN; diff --git a/db/routines/vn/triggers/warehouse_afterUpdate.sql b/db/routines/vn/triggers/warehouse_afterUpdate.sql deleted file mode 100644 index 93f424429..000000000 --- a/db/routines/vn/triggers/warehouse_afterUpdate.sql +++ /dev/null @@ -1,12 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`warehouse_afterUpdate` - AFTER UPDATE ON `warehouse` - FOR EACH ROW -BEGIN - IF NEW.isFeedStock IS TRUE AND OLD.isFeedStock IS FALSE THEN - INSERT IGNORE INTO warehouseAlias(`name`) VALUES(NEW.`name`); - INSERT IGNORE INTO warehouseJoined(warehouseFk, warehouseAliasFk) - VALUES(NEW.id,LAST_INSERT_ID()); - END IF; -END$$ -DELIMITER ; diff --git a/db/routines/vn/views/itemShelvingAvailable.sql b/db/routines/vn/views/itemShelvingAvailable.sql index e9599a1db..ee4ef62b6 100644 --- a/db/routines/vn/views/itemShelvingAvailable.sql +++ b/db/routines/vn/views/itemShelvingAvailable.sql @@ -1,7 +1,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vn`.`itemShelvingAvailable` -AS SELECT `s`.`id` AS `saleFk`, +AS SELECT `s`.`id` `saleFk`, `tst`.`updated` AS `Modificado`, `s`.`ticketFk` AS `ticketFk`, 0 AS `isPicked`, @@ -38,7 +38,7 @@ FROM ( ) JOIN `vn`.`agencyMode` `am` ON(`am`.`id` = `t`.`agencyModeFk`) ) - JOIN `vn`.`ticketStateToday` `tst` ON(`tst`.`ticket` = `t`.`id`) + JOIN `vn`.`ticketStateToday` `tst` ON(`tst`.`ticketFk` = `t`.`id`) ) JOIN `vn`.`state` `st` ON(`st`.`id` = `tst`.`state`) ) diff --git a/db/routines/vn/views/warehouseJoined.sql b/db/routines/vn/views/warehouseJoined.sql deleted file mode 100644 index dbbb40b1a..000000000 --- a/db/routines/vn/views/warehouseJoined.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn`.`warehouseJoined` -AS SELECT `wj`.`warehouse_id` AS `warehouseFk`, - `wj`.`warehouse_alias_id` AS `warehouseAliasFk` -FROM `vn2008`.`warehouse_joined` `wj` diff --git a/db/routines/vn/views/zoneEstimatedDelivery.sql b/db/routines/vn/views/zoneEstimatedDelivery.sql index 621d1a8f0..c04f3fbd5 100644 --- a/db/routines/vn/views/zoneEstimatedDelivery.sql +++ b/db/routines/vn/views/zoneEstimatedDelivery.sql @@ -14,7 +14,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` JOIN saleVolume sv ON sv.ticketFk = t.id LEFT JOIN lastHourProduction lhp ON lhp.warehouseFk = t.warehouseFk JOIN warehouse w ON w.id = t.warehouseFk - JOIN warehouseAlias wa ON wa.id = w.aliasFk STRAIGHT_JOIN `zone` z ON z.id = t.zoneFk LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk AND zc.dated = util.VN_CURDATE() diff --git a/db/routines/vn2008/functions/intrastat_neto.sql b/db/routines/vn2008/functions/intrastat_neto.sql deleted file mode 100644 index 34e01de8c..000000000 --- a/db/routines/vn2008/functions/intrastat_neto.sql +++ /dev/null @@ -1,20 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn2008`.`intrastat_neto`(intINSTRASTAT INTEGER,intUNIDADES INTEGER) - RETURNS double - DETERMINISTIC -BEGIN - - DECLARE n DOUBLE; - - SELECT ROUND(intUNIDADES / (SUM(MEDIA) / COUNT(media)), 2) INTO n FROM - (SELECT *, unidades / neto MEDIA - FROM intrastat_data - WHERE intrastat_id = intINSTRASTAT AND neto - AND unidades > 0 - ORDER BY odbc_date DESC - LIMIT 20) t; - -- JGF 01/06 per a evitar Kg en negatiu - RETURN n/2; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/functions/red.sql b/db/routines/vn2008/functions/red.sql deleted file mode 100644 index b94e3d716..000000000 --- a/db/routines/vn2008/functions/red.sql +++ /dev/null @@ -1,14 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn2008`.`red`(intCANTIDAD DOUBLE) - RETURNS double - DETERMINISTIC -BEGIN - - DECLARE n DOUBLE; - - SET n = SIGN(intCANTIDAD) * TRUNCATE( (ABS(intCANTIDAD) * 100) + 0.5001 ,0) /100 ; - - RETURN n; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/desglose_volume.sql b/db/routines/vn2008/procedures/desglose_volume.sql deleted file mode 100644 index 3fcad4b71..000000000 --- a/db/routines/vn2008/procedures/desglose_volume.sql +++ /dev/null @@ -1,82 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`desglose_volume`(IN vAgencyFk INT) -BEGIN - - DECLARE vStarted DATETIME DEFAULT TIMESTAMP(util.VN_CURDATE()); - DECLARE vEnded DATETIME DEFAULT TIMESTAMP(util.VN_CURDATE(), '23:59:59'); - DECLARE vIsHolland BOOL; - - SELECT (wa.name = 'Holanda') INTO vIsHolland - FROM vn.agency a - JOIN vn.warehouseAlias wa ON wa.id = a.warehouseAliasFk - WHERE a.id = vAgencyFk; - - IF vIsHolland THEN - - DROP TEMPORARY TABLE IF EXISTS tmp.ticket_PackagingEstimated; - CREATE TEMPORARY TABLE tmp.ticket_PackagingEstimated - ( - ticketFk INT PRIMARY KEY - ,carros DECIMAL(5,1) DEFAULT 0 - ); - - INSERT INTO tmp.ticket_PackagingEstimated(ticketFk, carros) - SELECT sv.ticketFk, ROUND(vc.dutchCompressionRate * sum(sv.volume) / vc.trolleyM3,0) - FROM vn.ticket t - JOIN vn.saleVolume sv ON sv.ticketFk = t.id - JOIN vn.agencyMode am ON am.id = t.agencyModeFk - JOIN vn.volumeConfig vc - WHERE t.shipped BETWEEN vStarted AND vEnded - AND am.agencyFk = vAgencyFk - GROUP BY t.id; - - SELECT a.nickname Provincia, - count(*) expediciones, - 0 Bultos, - sum(tpe.carros) Prevision - FROM vn.ticket t - JOIN vn.address a ON a.id = t.addressFk - JOIN tmp.ticket_PackagingEstimated tpe ON tpe.ticketFk = t.id - GROUP BY a.nickname; - - ELSE - - DROP TEMPORARY TABLE IF EXISTS tmp.ticket_PackagingEstimated; - CREATE TEMPORARY TABLE tmp.ticket_PackagingEstimated - ( - ticketFk INT PRIMARY KEY - ,boxes INT DEFAULT 0 - ); - - INSERT INTO tmp.ticket_PackagingEstimated(ticketFk, boxes) - SELECT sv.ticketFk, CEIL(1000 * sum(sv.volume) / vc.standardFlowerBox) - FROM vn.ticket t - JOIN vn.saleVolume sv ON sv.ticketFk = t.id - JOIN vn.agencyMode am ON am.id = t.agencyModeFk - JOIN vn.volumeConfig vc - WHERE t.shipped BETWEEN vStarted AND vEnded - AND IFNULL(t.packages,0) = 0 - AND am.agencyFk = vAgencyFk - GROUP BY t.id; - - - SELECT p.name Provincia, - count(*) expediciones, - sum(t.packages) Bultos, - sum(tpe.boxes) Prevision - FROM vn.ticket t - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.province p ON a.provinceFk = p.id - JOIN vn.agencyMode am ON am.id = t.agencyModeFk - JOIN tmp.ticket_PackagingEstimated tpe ON tpe.ticketFk = t.id - WHERE t.warehouseFk = 60 - AND t.shipped BETWEEN vStarted AND vEnded - AND am.agencyFk = vAgencyFk - GROUP BY p.name; - - END IF; - SELECT * FROM tmp.ticket_PackagingEstimated; - DROP TEMPORARY TABLE tmp.ticket_PackagingEstimated; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/views/Articles_botanical.sql b/db/routines/vn2008/views/Articles_botanical.sql deleted file mode 100644 index 44edda655..000000000 --- a/db/routines/vn2008/views/Articles_botanical.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`Articles_botanical` -AS SELECT `ab`.`itemFk` AS `Id_Article`, - `ab`.`genusFk` AS `genus_id`, - `ab`.`specieFk` AS `specie_id` -FROM `vn`.`itemBotanical` `ab` diff --git a/db/routines/vn2008/views/agency.sql b/db/routines/vn2008/views/agency.sql index 819fbd009..637bb0910 100644 --- a/db/routines/vn2008/views/agency.sql +++ b/db/routines/vn2008/views/agency.sql @@ -4,7 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` AS SELECT `a`.`id` AS `agency_id`, `a`.`name` AS `name`, `a`.`warehouseFk` AS `warehouse_id`, - `a`.`warehouseAliasFk` AS `warehouse_alias_id`, `a`.`isOwn` AS `propios`, `a`.`workCenterFk` AS `workCenterFk` FROM `vn`.`agency` `a` diff --git a/db/routines/vn2008/views/bionic_updating_options.sql b/db/routines/vn2008/views/bionic_updating_options.sql deleted file mode 100644 index 7ee531238..000000000 --- a/db/routines/vn2008/views/bionic_updating_options.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`bionic_updating_options` -AS SELECT `t`.`id` AS `buo_id`, - `t`.`description` AS `description` -FROM `vn`.`ticketUpdateAction` `t` diff --git a/db/routines/vn2008/views/businessReasonEnd.sql b/db/routines/vn2008/views/businessReasonEnd.sql deleted file mode 100644 index 459a33a8b..000000000 --- a/db/routines/vn2008/views/businessReasonEnd.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`businessReasonEnd` -AS SELECT `b`.`id` AS `id`, - `b`.`reason` AS `reason` -FROM `vn`.`businessReasonEnd` `b` diff --git a/db/routines/vn2008/views/cl_dev.sql b/db/routines/vn2008/views/cl_dev.sql deleted file mode 100644 index 7364fe833..000000000 --- a/db/routines/vn2008/views/cl_dev.sql +++ /dev/null @@ -1,6 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`cl_dev` -AS SELECT `c`.`id` AS `id`, - `c`.`description` AS `devolucion` -FROM `vn`.`claimRedelivery` `c` diff --git a/db/routines/vn2008/views/cl_est.sql b/db/routines/vn2008/views/cl_est.sql deleted file mode 100644 index 8aa6ecb2e..000000000 --- a/db/routines/vn2008/views/cl_est.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`cl_est` -AS SELECT `c`.`id` AS `id`, - `c`.`description` AS `estado`, - `c`.`roleFk` AS `roleFk` -FROM `vn`.`claimState` `c` diff --git a/db/versions/10857-navyArborvitae/00-firstScript.sql b/db/versions/10857-navyArborvitae/00-firstScript.sql new file mode 100644 index 000000000..64e4d5282 --- /dev/null +++ b/db/versions/10857-navyArborvitae/00-firstScript.sql @@ -0,0 +1,8 @@ +ALTER TABLE vn.agency + CHANGE warehouseAliasFk warehouseAliasFk__ SMALLINT(5) UNSIGNED DEFAULT NULL NULL COMMENT '@deprecated 2024-01-23 refs #5167'; + +ALTER TABLE vn.warehouse + CHANGE aliasFk aliasFk__ SMALLINT(5) UNSIGNED DEFAULT NULL NULL COMMENT '@deprecated 2024-01-23 refs #5167'; + +RENAME TABLE vn.warehouseAlias TO vn.warehouseAlias__; +ALTER TABLE vn.warehouseAlias__ COMMENT='@deprecated 2024-01-23 refs #5167'; \ No newline at end of file diff --git a/db/versions/10863-brownIvy/00-firstScript.sql b/db/versions/10863-brownIvy/00-firstScript.sql new file mode 100644 index 000000000..d3b79ae66 --- /dev/null +++ b/db/versions/10863-brownIvy/00-firstScript.sql @@ -0,0 +1,4 @@ +-- Place your SQL code here +UPDATE vn.supplier + SET name = UPPER(name), + nickname = UPPER(nickname); diff --git a/db/versions/10866-whiteRaphis/00-firstScript.sql b/db/versions/10866-whiteRaphis/00-firstScript.sql new file mode 100644 index 000000000..bfbcb5dc9 --- /dev/null +++ b/db/versions/10866-whiteRaphis/00-firstScript.sql @@ -0,0 +1 @@ +REVOKE EXECUTE ON FUNCTION vn2008.red FROM hrBoss, salesPerson; diff --git a/db/versions/10867-yellowAsparagus/00-createAclInvoiceIn.sql b/db/versions/10867-yellowAsparagus/00-createAclInvoiceIn.sql new file mode 100644 index 000000000..927903d47 --- /dev/null +++ b/db/versions/10867-yellowAsparagus/00-createAclInvoiceIn.sql @@ -0,0 +1,4 @@ +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) + VALUES + ('InvoiceIn', 'corrective', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('InvoiceInCorrection', '*', '*', 'ALLOW', 'ROLE', 'administrative'); \ No newline at end of file diff --git a/db/versions/10867-yellowAsparagus/01-createInvoiceInCorrection.sql b/db/versions/10867-yellowAsparagus/01-createInvoiceInCorrection.sql new file mode 100644 index 000000000..0d084da9e --- /dev/null +++ b/db/versions/10867-yellowAsparagus/01-createInvoiceInCorrection.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS `vn`.`invoiceInCorrection` ( + `correctingFk` mediumint(8) UNSIGNED NOT NULL COMMENT 'Factura rectificativa', + `correctedFk` mediumint(8) UNSIGNED NOT NULL COMMENT 'Factura rectificada', + `cplusRectificationTypeFk` int(10) UNSIGNED NOT NULL, + `siiTypeInvoiceOutFk` int(10) UNSIGNED NOT NULL, + `invoiceCorrectionTypeFk` int(11) NOT NULL DEFAULT 3, + PRIMARY KEY (`correctingFk`), + KEY `invoiceInCorrection_correctedFk` (`correctedFk`), + KEY `invoiceInCorrection_cplusRectificationTypeFk` (`cplusRectificationTypeFk`), + KEY `invoiceInCorrection_siiTypeInvoiceOut` (`siiTypeInvoiceOutFk`), + KEY `invoiceInCorrection_invoiceCorrectionTypeFk` (`invoiceCorrectionTypeFk`), + CONSTRAINT `invoiceInCorrection_correctedFk` FOREIGN KEY (`correctedFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `invoiceInCorrection_correctingFk` FOREIGN KEY (`correctingFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `invoiceInCorrection_siiTypeInvoiceOut` FOREIGN KEY (`siiTypeInvoiceOutFk`) REFERENCES `siiTypeInvoiceOut` (`id`) ON UPDATE CASCADE, + CONSTRAINT `invoiceInCorrection_invoiceCorrectionTypeFk` FOREIGN KEY (`invoiceCorrectionTypeFk`) REFERENCES `invoiceCorrectionType` (`id`) ON UPDATE CASCADE, + CONSTRAINT `invoiceInCorrection_cplusRectificationTypeFk` FOREIGN KEY (`cplusRectificationTypeFk`) REFERENCES `cplusRectificationType` (`id`) ON UPDATE CASCADE +); \ No newline at end of file diff --git a/db/versions/10871-wheatCyca/00-firstScript.sql b/db/versions/10871-wheatCyca/00-firstScript.sql new file mode 100644 index 000000000..62aff7dac --- /dev/null +++ b/db/versions/10871-wheatCyca/00-firstScript.sql @@ -0,0 +1 @@ +REVOKE SELECT ON TABLE vn2008.Articles_botanical FROM buyer, administrative; diff --git a/e2e/paths/13-supplier/01_summary_and_descriptor.spec.js b/e2e/paths/13-supplier/01_summary_and_descriptor.spec.js index 591a6116a..e82f851ea 100644 --- a/e2e/paths/13-supplier/01_summary_and_descriptor.spec.js +++ b/e2e/paths/13-supplier/01_summary_and_descriptor.spec.js @@ -24,7 +24,7 @@ describe('Supplier summary & descriptor path', () => { it(`should confirm there's data on the summary header`, async() => { const result = await page.waitToGetProperty(selectors.supplierSummary.header, 'innerText'); - expect(result).toContain('Plants SL - 1'); + expect(result).toContain('PLANTS SL - 1'); }); it(`should confirm there's data on the summary basic data`, async() => { diff --git a/e2e/paths/13-supplier/03_fiscal_data.spec.js b/e2e/paths/13-supplier/03_fiscal_data.spec.js index 96977e708..ccd9d7809 100644 --- a/e2e/paths/13-supplier/03_fiscal_data.spec.js +++ b/e2e/paths/13-supplier/03_fiscal_data.spec.js @@ -24,7 +24,7 @@ describe('Supplier fiscal data path', () => { country: null, postcode: null, city: 'Valencia', - socialName: 'Farmer King SL', + socialName: 'FARMER KING SL', taxNumber: '12345678Z', account: '0123456789', sageWithholding: 'retencion estimacion objetiva', @@ -46,7 +46,7 @@ describe('Supplier fiscal data path', () => { country: 'España', postcode: '46000', city: 'Valencia', - socialName: 'Farmer King SL', + socialName: 'FARMER KING SL', taxNumber: '12345678Z', account: '0123456789', sageWithholding: 'RETENCION ESTIMACION OBJETIVA', diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 059da6356..10ab08d57 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -204,6 +204,7 @@ "It was not able to remove the next expeditions:": "It was not able to remove the next expeditions: {{expeditions}}", "Incorrect pin": "Incorrect pin.", "The notification subscription of this worker cant be modified": "The notification subscription of this worker cant be modified", + "Name should be uppercase": "Name should be uppercase", "Fecha fuera de rango": "Fecha fuera de rango", "There is no zone for these parameters 34": "There is no zone for these parameters 34" -} \ No newline at end of file +} diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 67f9082ec..5c7dc41b6 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -337,5 +337,6 @@ "You already have the mailAlias": "Ya tienes este alias de correo", "The alias cant be modified": "Este alias de correo no puede ser modificado", "No tickets to invoice": "No hay tickets para facturar", + "Name should be uppercase": "El nombre debe ir en mayúscula", "An email is necessary": "Es necesario un email" } diff --git a/modules/invoiceIn/back/methods/invoice-in/clone.js b/modules/invoiceIn/back/methods/invoice-in/clone.js index 18df53a95..88ea0ddcd 100644 --- a/modules/invoiceIn/back/methods/invoice-in/clone.js +++ b/modules/invoiceIn/back/methods/invoice-in/clone.js @@ -2,13 +2,17 @@ module.exports = Self => { Self.remoteMethodCtx('clone', { description: 'Clone the invoiceIn and as many invoiceInTax and invoiceInDueDay referencing it', accessType: 'WRITE', - accepts: { + accepts: [{ arg: 'id', type: 'number', required: true, description: 'The invoiceIn id', http: {source: 'path'} - }, + }, { + arg: 'isRectification', + type: 'boolean', + description: 'Clone quantities in negative and clone Intrastat' + }], returns: { type: 'object', root: true @@ -19,7 +23,7 @@ module.exports = Self => { } }); - Self.clone = async(ctx, id, options) => { + Self.clone = async(ctx, id, isRectification, options) => { const models = Self.app.models; let tx; const myOptions = {}; @@ -45,14 +49,28 @@ module.exports = Self => { 'isVatDeductible', 'withholdingSageFk', 'deductibleExpenseFk', - ] + ], + include: [ + { + relation: 'invoiceInTax', + }, + { + relation: 'invoiceInDueDay', + }, + { + relation: 'invoiceInIntrastat' + } + ], }, myOptions); - const sourceInvoiceInTax = await models.InvoiceInTax.find({where: {invoiceInFk: id}}, myOptions); - const sourceInvoiceInDueDay = await models.InvoiceInDueDay.find({where: {invoiceInFk: id}}, myOptions); + const invoiceInTax = sourceInvoiceIn.invoiceInTax(); + const invoiceInDueDay = sourceInvoiceIn.invoiceInDueDay(); + const invoiceInIntrastat = sourceInvoiceIn.invoiceInIntrastat(); const issued = new Date(sourceInvoiceIn.issued); issued.setMonth(issued.getMonth() + 1); - const clonedRef = sourceInvoiceIn.supplierRef + '(2)'; + const totalCorrections = await models.InvoiceInCorrection.count({correctedFk: id}, myOptions); + + const clonedRef = sourceInvoiceIn.supplierRef + `(${totalCorrections + 2})`; const clone = await models.InvoiceIn.create({ serial: sourceInvoiceIn.serial, @@ -68,30 +86,44 @@ module.exports = Self => { const promises = []; - for (let tax of sourceInvoiceInTax) { + for (let tax of invoiceInTax) { promises.push(models.InvoiceInTax.create({ invoiceInFk: clone.id, - taxableBase: tax.taxableBase, + taxableBase: isRectification ? -tax.taxableBase : tax.taxableBase, expenseFk: tax.expenseFk, - foreignValue: tax.foreignValue, + foreignValue: isRectification ? -tax.foreignValue : tax.foreignValue, taxTypeSageFk: tax.taxTypeSageFk, transactionTypeSageFk: tax.transactionTypeSageFk }, myOptions)); } - for (let dueDay of sourceInvoiceInDueDay) { - const dueDated = dueDay.dueDated; - dueDated.setMonth(dueDated.getMonth() + 1); + if (!isRectification) { + for (let dueDay of invoiceInDueDay) { + const dueDated = dueDay.dueDated; + dueDated.setMonth(dueDated.getMonth() + 1); - promises.push(models.InvoiceInDueDay.create({ - invoiceInFk: clone.id, - dueDated: dueDated, - bankFk: dueDay.bankFk, - amount: dueDay.amount, - foreignValue: dueDated.foreignValue, - }, myOptions)); + promises.push(models.InvoiceInDueDay.create({ + invoiceInFk: clone.id, + dueDated: dueDated, + bankFk: dueDay.bankFk, + amount: dueDay.amount, + foreignValue: dueDated.foreignValue, + }, myOptions)); + } + } else { + for (let intrastat of invoiceInIntrastat) { + promises.push(models.InvoiceInIntrastat.create({ + invoiceInFk: clone.id, + net: -intrastat.net, + intrastatFk: intrastat.intrastatFk, + amount: -intrastat.amount, + stems: -intrastat.stems, + country: intrastat.countryFk, + dated: Date.vnNew(), + statisticalValue: intrastat.statisticalValue + }, myOptions)); + } } - await Promise.all(promises); if (tx) await tx.commit(); diff --git a/modules/invoiceIn/back/methods/invoice-in/corrective.js b/modules/invoiceIn/back/methods/invoice-in/corrective.js new file mode 100644 index 000000000..05f632bcd --- /dev/null +++ b/modules/invoiceIn/back/methods/invoice-in/corrective.js @@ -0,0 +1,58 @@ +module.exports = Self => { + Self.remoteMethodCtx('corrective', { + description: 'Creates a rectificated invoice in', + accessType: 'WRITE', + accepts: [{ + arg: 'id', + type: 'number' + }, { + arg: 'invoiceReason', + type: 'number', + }, { + arg: 'invoiceType', + type: 'number', + }, { + arg: 'invoiceClass', + type: 'number' + }], + returns: { + type: 'number', + root: true + }, + http: { + path: '/corrective', + verb: 'POST' + } + }); + + Self.corrective = async(ctx, id, invoiceReason, invoiceType, invoiceClass, options) => { + const models = Self.app.models; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const clone = await Self.clone(ctx, id, true, myOptions); + await models.InvoiceInCorrection.create({ + correctingFk: clone.id, + correctedFk: id, + cplusRectificationTypeFk: invoiceType, + siiTypeInvoiceOutFk: invoiceClass, + invoiceCorrectionTypeFk: invoiceReason + }, myOptions); + + if (tx) await tx.commit(); + return clone.id; + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/invoiceIn/back/methods/invoice-in/filter.js b/modules/invoiceIn/back/methods/invoice-in/filter.js index e9d3da43c..0d3b5f14a 100644 --- a/modules/invoiceIn/back/methods/invoice-in/filter.js +++ b/modules/invoiceIn/back/methods/invoice-in/filter.js @@ -1,4 +1,3 @@ - const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; @@ -80,6 +79,11 @@ module.exports = Self => { type: 'boolean', description: 'Whether the invoice is booked or not', }, + { + arg: 'correctedFk', + type: 'number', + description: 'The corrected invoice', + } ], returns: { type: ['object'], @@ -93,6 +97,7 @@ module.exports = Self => { Self.filter = async(ctx, filter, options) => { const conn = Self.dataSource.connector; + const models = Self.app.models; const args = ctx.args; const myOptions = {}; @@ -105,6 +110,14 @@ module.exports = Self => { dateTo.setHours(23, 59, 0, 0); } + let correctings; + if (args.correctedFk) { + correctings = await models.InvoiceInCorrection.find({ + fields: ['correctingFk'], + where: {correctedFk: args.correctedFk} + }); + } + const where = buildFilter(ctx.args, (param, value) => { switch (param) { case 'search': @@ -128,6 +141,8 @@ module.exports = Self => { return {[`ii.${param}`]: value}; case 'awbCode': return {'sub.code': value}; + case 'correctedFk': + return {'ii.id': {inq: correctings.map(x => x.correctingFk)}}; } }); diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js index 42ebe52b3..436306aab 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/clone.spec.js @@ -2,50 +2,75 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); describe('invoiceIn clone()', () => { - beforeAll(async() => { - const activeCtx = { - accessToken: {userId: 9}, - http: { - req: { - headers: {origin: 'http://localhost'} - } - } + let ctx; + let options; + let tx; + + beforeEach(async() => { + ctx = { + req: { + accessToken: {userId: 1}, + headers: {origin: 'http://localhost'} + }, + args: {} }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ - active: activeCtx + active: ctx.req }); + + options = {transaction: tx}; + tx = await models.Sale.beginTransaction({}); + options.transaction = tx; + }); + + afterEach(async() => { + await tx.rollback(); }); it('should return the cloned invoiceIn and also clone invoiceInDueDays and invoiceInTaxes if there are any referencing the invoiceIn', async() => { - const userId = 1; - const ctx = { - req: { + const clone = await models.InvoiceIn.clone(ctx, 1, false, options); - accessToken: {userId: userId}, - headers: {origin: 'http://localhost:5000'}, + expect(clone.supplierRef).toEqual('1234(2)'); + const invoiceIn = await models.InvoiceIn.findOne({ + include: [ + { + relation: 'invoiceInTax', + }, + { + relation: 'invoiceInDueDay', + } + ], where: { + id: clone.id } - }; + }, options); + const invoiceInTax = invoiceIn.invoiceInTax(); + const invoiceInDueDay = invoiceIn.invoiceInDueDay(); - const tx = await models.InvoiceIn.beginTransaction({}); - const options = {transaction: tx}; + expect(invoiceInTax.length).toEqual(2); + expect(invoiceInDueDay.length).toEqual(2); + }); - try { - const clone = await models.InvoiceIn.clone(ctx, 1, options); + it('should return the cloned invoiceIn and also clone invoiceInIntrastat and invoiceInTaxes if it is rectificative', async() => { + const clone = await models.InvoiceIn.clone(ctx, 1, true, options); - expect(clone.supplierRef).toEqual('1234(2)'); + expect(clone.supplierRef).toEqual('1234(2)'); + const invoiceIn = await models.InvoiceIn.findOne({ + include: [ + { + relation: 'invoiceInTax', + }, + { + relation: 'invoiceInIntrastat', + } + ], where: { + id: clone.id + } + }, options); + const invoiceInTax = invoiceIn.invoiceInTax(); + const invoiceInIntrastat = invoiceIn.invoiceInIntrastat(); - const invoiceInTaxes = await models.InvoiceInTax.find({where: {invoiceInFk: clone.id}}, options); - - expect(invoiceInTaxes.length).toEqual(2); - - const invoiceInDueDays = await models.InvoiceInDueDay.find({where: {invoiceInFk: clone.id}}, options); - - expect(invoiceInDueDays.length).toEqual(2); - - await tx.rollback(); - } catch (e) { - await tx.rollback(); - throw e; - } + expect(invoiceInTax.length).toEqual(2); + expect(invoiceInIntrastat.length).toEqual(2); }); }); diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js new file mode 100644 index 000000000..1047cd028 --- /dev/null +++ b/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js @@ -0,0 +1,49 @@ +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); + +describe('invoiceIn corrective()', () => { + let ctx; + let options; + let tx; + + beforeEach(async() => { + ctx = { + req: { + accessToken: {userId: 9}, + headers: {origin: 'http://localhost'} + }, + args: {} + }; + + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: ctx.req + }); + + options = {transaction: tx}; + tx = await models.Sale.beginTransaction({}); + options.transaction = tx; + }); + + afterEach(async() => { + await tx.rollback(); + }); + + it('La función corrective debería devolver un id cuando se ejecuta correctamente', async() => { + const originalId = 1; + const invoiceReason = 3; + const invoiceType = 2; + const invoiceClass = 1; + const cloneId = await models.InvoiceIn.corrective(ctx, + originalId, invoiceReason, invoiceType, invoiceClass, options); + + expect(cloneId).toBeDefined(); + + const correction = await models.InvoiceInCorrection.findOne({ + where: {correctedFk: originalId, correctingFk: cloneId} + }, options); + + expect(correction.cplusRectificationTypeFk).toEqual(invoiceType); + expect(correction.siiTypeInvoiceOutFk).toEqual(invoiceClass); + expect(correction.invoiceCorrectionTypeFk).toEqual(invoiceReason); + }); +}); diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js index 76f17720f..9834989fc 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js @@ -8,14 +8,14 @@ describe('InvoiceIn filter()', () => { try { const ctx = { args: { - search: 'Plants SL', + search: 'PLANTS SL', } }; const result = await models.InvoiceIn.filter(ctx, {}, options); expect(result.length).toEqual(5); - expect(result[0].supplierName).toEqual('Plants SL'); + expect(result[0].supplierName).toEqual('PLANTS SL'); await tx.rollback(); } catch (e) { diff --git a/modules/invoiceIn/back/model-config.json b/modules/invoiceIn/back/model-config.json index bd37b3bf1..4e0adf7a3 100644 --- a/modules/invoiceIn/back/model-config.json +++ b/modules/invoiceIn/back/model-config.json @@ -5,6 +5,9 @@ "InvoiceInConfig": { "dataSource": "vn" }, + "InvoiceInCorrection": { + "dataSource": "vn" + }, "InvoiceInDueDay": { "dataSource": "vn" }, diff --git a/modules/invoiceIn/back/models/invoice-in-correction.json b/modules/invoiceIn/back/models/invoice-in-correction.json new file mode 100644 index 000000000..52e16d420 --- /dev/null +++ b/modules/invoiceIn/back/models/invoice-in-correction.json @@ -0,0 +1,38 @@ +{ + "name": "InvoiceInCorrection", + "base": "VnModel", + "options": { + "mysql": { + "table": "invoiceInCorrection" + } + }, + "properties": { + "correctingFk": { + "id": true, + "type": "number" + } + }, + "relations": { + "invoiceIn": { + "type": "belongsTo", + "model": "InvoiceIn", + "foreignKey": "correctedFk" + }, + "cplusRectificationType": { + "type": "belongsTo", + "model": "CplusRectificationType", + "foreignKey": "cplusRectificationTypeFk" + }, + "invoiceCorrectionType": { + "type": "belongsTo", + "model": "InvoiceCorrectionType", + "foreignKey": "invoiceCorrectionTypeFk" + }, + "siiTypeInvoiceOut": { + "type": "belongsTo", + "model": "SiiTypeInvoiceOut", + "foreignKey": "siiTypeInvoiceOutFk" + } + + } +} \ No newline at end of file diff --git a/modules/invoiceIn/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoice-in.js index 82e0bf078..af5efbcdf 100644 --- a/modules/invoiceIn/back/models/invoice-in.js +++ b/modules/invoiceIn/back/models/invoice-in.js @@ -9,6 +9,8 @@ module.exports = Self => { require('../methods/invoice-in/invoiceInPdf')(Self); require('../methods/invoice-in/invoiceInEmail')(Self); require('../methods/invoice-in/getSerial')(Self); + require('../methods/invoice-in/corrective')(Self); + Self.rewriteDbError(function(err) { if (err.code === 'ER_ROW_IS_REFERENCED_2' && err.sqlMessage.includes('vehicleInvoiceIn')) return new UserError(`This invoice has a linked vehicle.`); diff --git a/modules/invoiceIn/back/models/invoice-in.json b/modules/invoiceIn/back/models/invoice-in.json index 59c179e76..9614c3872 100644 --- a/modules/invoiceIn/back/models/invoice-in.json +++ b/modules/invoiceIn/back/models/invoice-in.json @@ -103,6 +103,11 @@ "type": "belongsTo", "model": "Dms", "foreignKey": "dmsFk" + }, + "invoiceInCorrection": { + "type": "hasOne", + "model": "InvoiceInCorrection", + "foreignKey": "correctedFk" } } } diff --git a/modules/invoiceOut/back/models/sii-type-invoice-out.json b/modules/invoiceOut/back/models/sii-type-invoice-out.json index 58d50a12c..37fd39c38 100644 --- a/modules/invoiceOut/back/models/sii-type-invoice-out.json +++ b/modules/invoiceOut/back/models/sii-type-invoice-out.json @@ -17,6 +17,9 @@ }, "description": { "type": "string" + }, + "code": { + "type": "string" } } } diff --git a/modules/supplier/back/methods/supplier/specs/getSummary.spec.js b/modules/supplier/back/methods/supplier/specs/getSummary.spec.js index 30713f517..347851561 100644 --- a/modules/supplier/back/methods/supplier/specs/getSummary.spec.js +++ b/modules/supplier/back/methods/supplier/specs/getSummary.spec.js @@ -5,7 +5,7 @@ describe('Supplier getSummary()', () => { const supplier = await app.models.Supplier.getSummary(1); expect(supplier.id).toEqual(1); - expect(supplier.name).toEqual('Plants SL'); + expect(supplier.name).toEqual('PLANTS SL'); expect(supplier.nif).toEqual('06089160W'); expect(supplier.account).toEqual('4100000001'); expect(supplier.payDay).toEqual(15); diff --git a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js index 5fc2ea752..0e7fa0e34 100644 --- a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js +++ b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js @@ -25,13 +25,13 @@ describe('Supplier newSupplier()', () => { try { const options = {transaction: tx}; ctx.args = { - name: 'newSupplier', + name: 'NEWSUPPLIER', nif: '12345678Z' }; const result = await models.Supplier.newSupplier(ctx, options); - expect(result.name).toEqual('newSupplier'); + expect(result.name).toEqual('NEWSUPPLIER'); await tx.rollback(); } catch (e) { await tx.rollback(); diff --git a/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js b/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js index a47e547d1..56030a894 100644 --- a/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js +++ b/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js @@ -6,7 +6,7 @@ describe('Supplier updateFiscalData', () => { const administrativeId = 5; const employeeId = 1; const defaultData = { - name: 'Plants SL', + name: 'PLANTS SL', nif: '06089160W', account: '4100000001', sageTaxTypeFk: 4, @@ -56,7 +56,7 @@ describe('Supplier updateFiscalData', () => { }); ctx.args = { - name: 'Weapon Dealer', + name: 'WEAPON DEALER', nif: 'A68446004', account: '4000000005', sageTaxTypeFk: 5, @@ -72,7 +72,7 @@ describe('Supplier updateFiscalData', () => { const result = await app.models.Supplier.updateFiscalData(ctx, supplierId); - expect(result.name).toEqual('Weapon Dealer'); + expect(result.name).toEqual('WEAPON DEALER'); expect(result.nif).toEqual('A68446004'); expect(result.account).toEqual('4000000005'); expect(result.sageTaxTypeFk).toEqual(5); diff --git a/modules/supplier/back/models/specs/supplier.spec.js b/modules/supplier/back/models/specs/supplier.spec.js index fbd3a00db..3f40ce58b 100644 --- a/modules/supplier/back/models/specs/supplier.spec.js +++ b/modules/supplier/back/models/specs/supplier.spec.js @@ -129,7 +129,7 @@ describe('loopback model Supplier', () => { const options = {transaction: tx}; try { - const newSupplier = await models.Supplier.create({name: 'Alfred Pennyworth'}, options); + const newSupplier = await models.Supplier.create({name: 'ALFRED PENNYWORTH'}, options); const fetchedSupplier = await models.Supplier.findById(newSupplier.id, null, options); expect(Number(fetchedSupplier.account)).toEqual(4100000000 + newSupplier.id); diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js index 5cf357c13..0ac389074 100644 --- a/modules/supplier/back/models/supplier.js +++ b/modules/supplier/back/models/supplier.js @@ -46,6 +46,12 @@ module.exports = Self => { Self.validateAsync('postCode', hasValidPostcode, { message: `The postcode doesn't exist. Please enter a correct one` }); + Self.validatesFormatOf('name', { + message: 'Name should be uppercase', + allowNull: false, + allowBlank: false, + with: /^[^a-z]*$/ + }); async function hasValidPostcode(err, done) { if (!this.postcode) diff --git a/modules/supplier/front/create/index.html b/modules/supplier/front/create/index.html index eb6e7261e..1e051f3a8 100644 --- a/modules/supplier/front/create/index.html +++ b/modules/supplier/front/create/index.html @@ -12,7 +12,8 @@ + vn-focus + ng-keyup="$ctrl.supplier.name = $ctrl.supplier.name.toUpperCase()">