232201_test_to_master #1582
19
CHANGELOG.md
19
CHANGELOG.md
|
@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [2322.01] - 2023-06-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente
|
||||||
|
- (Artículos -> Histórico) Filtro para mostrar lo anterior al inventario
|
||||||
|
- (Trabajadores -> Nuevo trabajador) Permite elegir el método de pago
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- (Trabajadores -> Nuevo trabajador) Los clientes se crean sin 'TR' pero se añade tipo de negocio 'Trabajador'
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- (Tickets -> Líneas) Se permite hacer split de líneas al mismo ticket
|
||||||
|
- (Tickets -> Cambiar estado) Ahora muestra la lista completa de todos los estados
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [2320.01] - 2023-05-25
|
## [2320.01] - 2023-05-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -24,10 +40,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
### Added
|
### Added
|
||||||
- (Usuarios -> Histórico) Nueva sección
|
- (Usuarios -> Histórico) Nueva sección
|
||||||
- (Roles -> Histórico) Nueva sección
|
- (Roles -> Histórico) Nueva sección
|
||||||
- (General -> Traducciones) Correo de bienvenida a clientes al portugués y al francés
|
- (Trabajadores -> Dar de alta) Permite elegir el método de pago
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
||||||
|
- (Trabajadores -> Dar de alta) Quitada obligatoriedad del iban
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- (Ticket -> Boxing) Arreglado selección de horas
|
- (Ticket -> Boxing) Arreglado selección de horas
|
||||||
|
|
|
@ -23,13 +23,7 @@ module.exports = Self => {
|
||||||
let models = Self.app.models;
|
let models = Self.app.models;
|
||||||
|
|
||||||
let user = await Self.findById(userId, {
|
let user = await Self.findById(userId, {
|
||||||
fields: ['id', 'name', 'nickname', 'email', 'lang'],
|
fields: ['id', 'name', 'nickname', 'email', 'lang']
|
||||||
include: {
|
|
||||||
relation: 'userConfig',
|
|
||||||
scope: {
|
|
||||||
fields: ['darkMode']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let roles = await models.RoleMapping.find({
|
let roles = await models.RoleMapping.find({
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
FROM mariadb:10.7.3
|
FROM mariadb:10.7.5
|
||||||
|
|
||||||
ENV MYSQL_ROOT_PASSWORD root
|
ENV MYSQL_ROOT_PASSWORD root
|
||||||
ENV TZ Europe/Madrid
|
ENV TZ Europe/Madrid
|
||||||
|
ARG MOCKDATE=2001-01-01 11:00:00
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
||||||
&& curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \
|
&& curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \
|
||||||
|
@ -31,14 +32,15 @@ COPY \
|
||||||
import-changes.sh \
|
import-changes.sh \
|
||||||
config.ini \
|
config.ini \
|
||||||
dump/mysqlPlugins.sql \
|
dump/mysqlPlugins.sql \
|
||||||
dump/mockDate.sql \
|
|
||||||
dump/structure.sql \
|
dump/structure.sql \
|
||||||
|
dump/mockDate.sql \
|
||||||
dump/dumpedFixtures.sql \
|
dump/dumpedFixtures.sql \
|
||||||
./
|
./
|
||||||
RUN gosu mysql docker-init.sh \
|
RUN gosu mysql docker-init.sh \
|
||||||
&& docker-dump.sh mysqlPlugins \
|
&& docker-dump.sh mysqlPlugins \
|
||||||
&& docker-dump.sh mockDate \
|
|
||||||
&& docker-dump.sh structure \
|
&& docker-dump.sh structure \
|
||||||
|
&& sed -i -e 's/@mockDate/'"$MOCKDATE"'/g' mockDate.sql \
|
||||||
|
&& docker-dump.sh mockDate \
|
||||||
&& docker-dump.sh dumpedFixtures \
|
&& docker-dump.sh dumpedFixtures \
|
||||||
&& gosu mysql docker-temp-stop.sh
|
&& gosu mysql docker-temp-stop.sh
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
-- vn.defaulter source
|
||||||
|
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn`.`defaulter` AS
|
||||||
|
select
|
||||||
|
`d`.`clientFk` AS `clientFk`,
|
||||||
|
`d`.`created` AS `created`,
|
||||||
|
`d`.`amount` AS `amount`,
|
||||||
|
`d`.`defaulterSinced` AS `defaulterSinced`,
|
||||||
|
`d`.`hasChanged` AS `hasChanged`,
|
||||||
|
`c`.`countryFk` AS `country`,
|
||||||
|
`c`.`payMethodFk` AS `payMethod`
|
||||||
|
from
|
||||||
|
(((`bs`.`defaulter` `d`
|
||||||
|
join `vn`.`client` `c` on
|
||||||
|
(`c`.`id` = `d`.`clientFk`))
|
||||||
|
join `vn`.`country` `co` on
|
||||||
|
(`co`.`id` = `c`.`countryFk`))
|
||||||
|
join `vn`.`payMethod` `pm` on
|
||||||
|
(`pm`.`id` = `c`.`payMethodFk`));
|
|
@ -0,0 +1,127 @@
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
||||||
|
*
|
||||||
|
* @param vDateFuture Fecha de los tickets que se quieren adelantar.
|
||||||
|
* @param vDateToAdvance Fecha a cuando se quiere adelantar.
|
||||||
|
* @param vWarehouseFk Almacén
|
||||||
|
*/
|
||||||
|
|
||||||
|
DECLARE vDateInventory DATE;
|
||||||
|
|
||||||
|
SELECT inventoried INTO vDateInventory FROM config;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.stock;
|
||||||
|
CREATE TEMPORARY TABLE tmp.stock
|
||||||
|
(itemFk INT PRIMARY KEY,
|
||||||
|
amount INT)
|
||||||
|
ENGINE = MEMORY;
|
||||||
|
|
||||||
|
INSERT INTO tmp.stock(itemFk, amount)
|
||||||
|
SELECT itemFk, SUM(quantity) amount FROM
|
||||||
|
(
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemTicketOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryIn
|
||||||
|
WHERE landed >= vDateInventory
|
||||||
|
AND landed < vDateFuture
|
||||||
|
AND isVirtualStock = FALSE
|
||||||
|
AND warehouseInFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseOutFk = vWarehouseFk
|
||||||
|
) t
|
||||||
|
GROUP BY itemFk HAVING amount != 0;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
SELECT
|
||||||
|
origin.ticketFk futureId,
|
||||||
|
dest.ticketFk id,
|
||||||
|
dest.state,
|
||||||
|
origin.futureState,
|
||||||
|
origin.futureIpt,
|
||||||
|
dest.ipt,
|
||||||
|
origin.workerFk,
|
||||||
|
origin.futureLiters,
|
||||||
|
origin.futureLines,
|
||||||
|
dest.shipped,
|
||||||
|
origin.shipped futureShipped,
|
||||||
|
dest.totalWithVat,
|
||||||
|
origin.totalWithVat futureTotalWithVat,
|
||||||
|
dest.agency,
|
||||||
|
origin.futureAgency,
|
||||||
|
dest.lines,
|
||||||
|
dest.liters,
|
||||||
|
origin.futureLines - origin.hasStock AS notMovableLines,
|
||||||
|
(origin.futureLines = origin.hasStock) AS isFullMovable,
|
||||||
|
origin.classColor,
|
||||||
|
dest.classColor futureClassColor
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
s.ticketFk,
|
||||||
|
t.workerFk,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
st.name futureState,
|
||||||
|
t.addressFk,
|
||||||
|
am.name futureAgency,
|
||||||
|
count(s.id) futureLines,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
|
||||||
|
SUM((s.quantity <= IFNULL(st.amount,0))) hasStock,
|
||||||
|
st.classColor
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
LEFT JOIN tmp.stock st ON st.itemFk = i.id
|
||||||
|
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id
|
||||||
|
) origin
|
||||||
|
JOIN (
|
||||||
|
SELECT
|
||||||
|
t.id ticketFk,
|
||||||
|
t.addressFk,
|
||||||
|
st.name state,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
am.name agency,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(COUNT(*) AS DECIMAL(10,0)) `lines`,
|
||||||
|
st.classColor
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
AND st.order <= 5
|
||||||
|
GROUP BY t.id
|
||||||
|
) dest ON dest.addressFk = origin.addressFk
|
||||||
|
WHERE origin.hasStock != 0;
|
||||||
|
DROP TEMPORARY TABLE tmp.stock;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,72 @@
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canbePostponed`(vOriginDated DATE, vFutureDated DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve un listado de tickets susceptibles de fusionarse con otros tickets en el futuro
|
||||||
|
*
|
||||||
|
* @param vOriginDated Fecha en cuestión
|
||||||
|
* @param vFutureDated Fecha en el futuro a sondear
|
||||||
|
* @param vWarehouseFk Identificador de vn.warehouse
|
||||||
|
*/
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
SELECT sv.ticketFk id,
|
||||||
|
sub2.id futureId,
|
||||||
|
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt,
|
||||||
|
CAST(sum(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(count(*) AS DECIMAL(10,0)) `lines`,
|
||||||
|
st.name state,
|
||||||
|
sub2.iptd futureIpt,
|
||||||
|
sub2.state futureState,
|
||||||
|
t.clientFk,
|
||||||
|
t.warehouseFk,
|
||||||
|
ts.alertLevel,
|
||||||
|
t.shipped,
|
||||||
|
sub2.shipped futureShipped,
|
||||||
|
t.workerFk,
|
||||||
|
st.code stateCode,
|
||||||
|
sub2.code futureStateCode,
|
||||||
|
st.classColor
|
||||||
|
FROM vn.saleVolume sv
|
||||||
|
JOIN vn.sale s ON s.id = sv.saleFk
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.ticket t ON t.id = sv.ticketFk
|
||||||
|
JOIN vn.address a ON a.id = t.addressFk
|
||||||
|
JOIN vn.province p ON p.id = a.provinceFk
|
||||||
|
JOIN vn.country c ON c.id = p.countryFk
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.alertLevel al ON al.id = ts.alertLevel
|
||||||
|
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
t.addressFk,
|
||||||
|
t.id,
|
||||||
|
t.shipped,
|
||||||
|
st.name state,
|
||||||
|
st.code code,
|
||||||
|
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) iptd
|
||||||
|
FROM vn.ticket t
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.sale s ON s.ticketFk = t.id
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
WHERE t.shipped BETWEEN vFutureDated
|
||||||
|
AND util.dayend(vFutureDated)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id
|
||||||
|
) sub
|
||||||
|
GROUP BY sub.addressFk
|
||||||
|
) sub2 ON sub2.addressFk = t.addressFk AND t.id != sub2.id
|
||||||
|
WHERE t.shipped BETWEEN vOriginDated AND util.dayend(vOriginDated)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
AND al.code = 'FREE'
|
||||||
|
AND tp.ticketFk IS NULL
|
||||||
|
GROUP BY sv.ticketFk
|
||||||
|
HAVING futureId;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,7 @@
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD payMethodFk tinyint(3) unsigned NULL;
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD CONSTRAINT workerConfig_FK FOREIGN KEY (roleFk) REFERENCES account.`role`(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD CONSTRAINT workerConfig_FK_1 FOREIGN KEY (payMethodFk) REFERENCES `vn`.`payMethod`(id) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
UPDATE `vn`.`workerConfig`
|
||||||
|
SET payMethodFk = 4
|
||||||
|
WHERE id=1;
|
File diff suppressed because one or more lines are too long
|
@ -349,20 +349,20 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
|
||||||
(4, 'GCN Channel'),
|
(4, 'GCN Channel'),
|
||||||
(5, 'The Newspaper');
|
(5, 'The Newspaper');
|
||||||
|
|
||||||
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`,`mailAddress`,`hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1109, 'Bruce Banner', '16104829E', 'Hulk', 'Black widow', 'Somewhere in New York', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist'),
|
(1109, 'Bruce Banner', '16104829E', 'Hulk', 'Black widow', 'Somewhere in New York', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist'),
|
||||||
(1110, 'Jessica Jones', '58282869H', 'Jessica Jones', 'Luke Cage', 'NYCC 2015 Poster', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist'),
|
(1110, 'Jessica Jones', '58282869H', 'Jessica Jones', 'Luke Cage', 'NYCC 2015 Poster', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist'),
|
||||||
(1111, 'Missing', NULL, 'Missing man', 'Anton', 'The space, Universe far away', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 1, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others'),
|
(1111, 'Missing', NULL, 'Missing man', 'Anton', 'The space, Universe far away', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others'),
|
||||||
(1112, 'Trash', NULL, 'Garbage man', 'Unknown name', 'New York city, Underground', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 1, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others');
|
(1112, 'Trash', NULL, 'Garbage man', 'Unknown name', 'New York city, Underground', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others');
|
||||||
|
|
||||||
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
||||||
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
||||||
|
@ -707,7 +707,7 @@ INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeF
|
||||||
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, util.VN_CURDATE()),
|
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +12 HOUR)),
|
||||||
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE()),
|
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE()),
|
||||||
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
||||||
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
||||||
|
@ -1940,6 +1940,16 @@ INSERT INTO `pbx`.`sip`(`user_id`, `extension`)
|
||||||
(5, 1102),
|
(5, 1102),
|
||||||
(9, 1201);
|
(9, 1201);
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`professionalCategory` (`id`, `name`, `level`, `dayBreak`)
|
||||||
|
VALUES
|
||||||
|
(1, 'employee', NULL, NULL),
|
||||||
|
(2, 'florist', NULL, NULL);
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`calendarType` (`id`, `description`, `hoursWeek`, `isPartial`)
|
||||||
|
VALUES
|
||||||
|
(1, 'General schedule', 40, 0);
|
||||||
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
||||||
CREATE TEMPORARY TABLE tmp.worker
|
CREATE TEMPORARY TABLE tmp.worker
|
||||||
(PRIMARY KEY (id))
|
(PRIMARY KEY (id))
|
||||||
|
@ -1968,7 +1978,7 @@ UPDATE `vn`.`business`
|
||||||
WHERE `id`= 1106;
|
WHERE `id`= 1106;
|
||||||
|
|
||||||
UPDATE `vn`.`business` b
|
UPDATE `vn`.`business` b
|
||||||
SET b.`workerBusinessProfessionalCategoryFk` = 31
|
SET b.`workerBusinessProfessionalCategoryFk` = 2
|
||||||
WHERE b.`workerFk` = 1110;
|
WHERE b.`workerFk` = 1110;
|
||||||
|
|
||||||
UPDATE `vn`.`business` b
|
UPDATE `vn`.`business` b
|
||||||
|
@ -2814,9 +2824,9 @@ INSERT INTO `vn`.`payDemDetail` (`id`, `detail`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1);
|
(1, 1);
|
||||||
|
|
||||||
INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `businessTypeFk`)
|
INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `payMethodFk`, `businessTypeFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, NULL, 1, 'worker');
|
(1, NULL, 1, 4, 'worker');
|
||||||
|
|
||||||
INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`)
|
INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -1,42 +1,33 @@
|
||||||
CREATE SCHEMA IF NOT EXISTS `util`;
|
DROP FUNCTION IF EXISTS `util`.`mockTime`;
|
||||||
USE `util`;
|
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER $$
|
||||||
DROP FUNCTION IF EXISTS `util`.`mockedDate`;
|
$$
|
||||||
CREATE FUNCTION `util`.`mockedDate`()
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockTime`() RETURNS datetime
|
||||||
RETURNS DATETIME
|
DETERMINISTIC
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN CONVERT_TZ('2001-01-01 11:00:00', 'utc', 'Europe/Madrid');
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DROP FUNCTION IF EXISTS `util`.`mockUtcTime`;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURDATE`;
|
|
||||||
CREATE FUNCTION `util`.`VN_CURDATE`()
|
DELIMITER $$
|
||||||
RETURNS DATE
|
$$
|
||||||
DETERMINISTIC
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockUtcTime`() RETURNS datetime
|
||||||
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN DATE(mockedDate());
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DROP FUNCTION IF EXISTS `util`.`mockTimeBase`;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURTIME`;
|
|
||||||
CREATE FUNCTION `util`.`VN_CURTIME`()
|
DELIMITER $$
|
||||||
RETURNS TIME
|
$$
|
||||||
DETERMINISTIC
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockTimeBase`(vIsUtc BOOL) RETURNS datetime
|
||||||
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN TIME(mockedDate());
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_NOW`;
|
|
||||||
CREATE FUNCTION `util`.`VN_NOW`()
|
|
||||||
RETURNS DATETIME
|
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
|
||||||
RETURN mockedDate();
|
|
||||||
END ;;
|
|
||||||
DELIMITER ;
|
|
||||||
|
|
12619
db/dump/structure.sql
12619
db/dump/structure.sql
File diff suppressed because it is too large
Load Diff
|
@ -100,11 +100,8 @@ dump_tables ${TABLES[@]}
|
||||||
|
|
||||||
TABLES=(
|
TABLES=(
|
||||||
postgresql
|
postgresql
|
||||||
calendar_labour_type
|
|
||||||
labour_agreement
|
labour_agreement
|
||||||
media_type
|
media_type
|
||||||
professional_category
|
|
||||||
profile_type
|
|
||||||
)
|
)
|
||||||
dump_tables ${TABLES[@]}
|
dump_tables ${TABLES[@]}
|
||||||
|
|
||||||
|
|
|
@ -93,12 +93,5 @@ mysqldump \
|
||||||
--databases \
|
--databases \
|
||||||
${SCHEMAS[@]} \
|
${SCHEMAS[@]} \
|
||||||
${IGNORETABLES[@]} \
|
${IGNORETABLES[@]} \
|
||||||
| sed 's/\bCURDATE\b/util.VN_CURDATE/ig'\
|
|
||||||
| sed 's/\bCURTIME\b/util.VN_CURTIME/ig' \
|
|
||||||
| sed 's/\bNOW\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/\bCURRENT_DATE\b/util.VN_CURDATE/ig' \
|
|
||||||
| sed 's/\bCURRENT_TIME\b/util.VN_CURTIME/ig' \
|
|
||||||
| sed 's/\bLOCALTIME\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/\bLOCALTIMESTAMP\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/ AUTO_INCREMENT=[0-9]* //g' \
|
| sed 's/ AUTO_INCREMENT=[0-9]* //g' \
|
||||||
> dump/structure.sql
|
> dump/structure.sql
|
||||||
|
|
|
@ -313,7 +313,7 @@ export default {
|
||||||
anyClient: 'vn-client-defaulter tbody > tr',
|
anyClient: 'vn-client-defaulter tbody > tr',
|
||||||
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(2) > span',
|
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(2) > span',
|
||||||
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(3) > span',
|
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(3) > span',
|
||||||
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(6) > vn-textarea[ng-model="defaulter.observation"]',
|
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(8) > vn-textarea[ng-model="defaulter.observation"]',
|
||||||
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
|
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
|
||||||
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',
|
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',
|
||||||
observation: '.vn-dialog.shown vn-textarea[ng-model="$ctrl.defaulter.observation"]',
|
observation: '.vn-dialog.shown vn-textarea[ng-model="$ctrl.defaulter.observation"]',
|
||||||
|
|
|
@ -50,6 +50,7 @@ describe('Item Edit basic data path', () => {
|
||||||
|
|
||||||
it(`should create a new intrastat and save it`, async() => {
|
it(`should create a new intrastat and save it`, async() => {
|
||||||
await page.click($.newIntrastatButton);
|
await page.click($.newIntrastatButton);
|
||||||
|
await page.waitForSelector($.intrastatForm);
|
||||||
await page.fillForm($.intrastatForm, {
|
await page.fillForm($.intrastatForm, {
|
||||||
id: '588420239',
|
id: '588420239',
|
||||||
description: 'Tropical Flowers'
|
description: 'Tropical Flowers'
|
||||||
|
|
|
@ -251,6 +251,7 @@ describe('Ticket Edit sale path', () => {
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenu);
|
await page.waitToClick(selectors.ticketSales.moreMenu);
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
|
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
|
||||||
await page.waitToClick(selectors.globalItems.acceptButton);
|
await page.waitToClick(selectors.globalItems.acceptButton);
|
||||||
|
await page.waitToClick(selectors.globalItems.acceptButton);
|
||||||
await page.waitForState('claim.card.basicData');
|
await page.waitForState('claim.card.basicData');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,20 @@
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
saveButton: 'vn-supplier-fiscal-data button[type="submit"]',
|
||||||
|
};
|
||||||
|
const $inputs = {
|
||||||
|
province: 'vn-supplier-fiscal-data [name="province"]',
|
||||||
|
country: 'vn-supplier-fiscal-data [name="country"]',
|
||||||
|
postcode: 'vn-supplier-fiscal-data [name="postcode"]',
|
||||||
|
city: 'vn-supplier-fiscal-data [name="city"]',
|
||||||
|
socialName: 'vn-supplier-fiscal-data [name="socialName"]',
|
||||||
|
taxNumber: 'vn-supplier-fiscal-data [name="taxNumber"]',
|
||||||
|
account: 'vn-supplier-fiscal-data [name="account"]',
|
||||||
|
sageWithholding: 'vn-supplier-fiscal-data [ng-model="$ctrl.supplier.sageWithholdingFk"]',
|
||||||
|
sageTaxType: 'vn-supplier-fiscal-data [ng-model="$ctrl.supplier.sageTaxTypeFk"]'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Supplier fiscal data path', () => {
|
describe('Supplier fiscal data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
|
|
@ -203,7 +203,7 @@ export default class Searchbar extends Component {
|
||||||
|
|
||||||
doSearch(filter, source) {
|
doSearch(filter, source) {
|
||||||
if (filter === this.filter && !this.isIndex) return;
|
if (filter === this.filter && !this.isIndex) return;
|
||||||
let promise = this.onSearch({$params: filter});
|
let promise = this.onSearch({$params: filter}, source);
|
||||||
promise = promise || this.$q.resolve();
|
promise = promise || this.$q.resolve();
|
||||||
promise.then(data => this.onFilter(filter, source, data));
|
promise.then(data => this.onFilter(filter, source, data));
|
||||||
this.toBar(filter);
|
this.toBar(filter);
|
||||||
|
@ -259,12 +259,6 @@ export default class Searchbar extends Component {
|
||||||
|
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
|
|
||||||
if (source == 'removeBar') {
|
|
||||||
delete params[this.toRemove];
|
|
||||||
delete this.model.userParams[this.toRemove];
|
|
||||||
this.model.refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!filter && this.model)
|
if (!filter && this.model)
|
||||||
this.model.clear();
|
this.model.clear();
|
||||||
if (source != 'state')
|
if (source != 'state')
|
||||||
|
@ -279,7 +273,7 @@ export default class Searchbar extends Component {
|
||||||
return {id: params.$row.id};
|
return {id: params.$row.id};
|
||||||
}
|
}
|
||||||
|
|
||||||
onSearch(args) {
|
onSearch(args, source) {
|
||||||
if (!this.model) return;
|
if (!this.model) return;
|
||||||
let filter = args.$params;
|
let filter = args.$params;
|
||||||
|
|
||||||
|
@ -325,6 +319,12 @@ export default class Searchbar extends Component {
|
||||||
for (let param in stateFilter.tableQ)
|
for (let param in stateFilter.tableQ)
|
||||||
params[param] = stateFilter.tableQ[param];
|
params[param] = stateFilter.tableQ[param];
|
||||||
|
|
||||||
|
if (source == 'removeBar') {
|
||||||
|
delete params[this.toRemove];
|
||||||
|
delete this.model.userParams[this.toRemove];
|
||||||
|
delete stateFilter[this.toRemove];
|
||||||
|
}
|
||||||
|
|
||||||
const newParams = Object.assign(stateFilter, params);
|
const newParams = Object.assign(stateFilter, params);
|
||||||
return this.model.applyParams(newParams)
|
return this.model.applyParams(newParams)
|
||||||
.then(() => this.model.data);
|
.then(() => this.model.data);
|
||||||
|
|
|
@ -197,7 +197,7 @@ describe('Component vnSearchbar', () => {
|
||||||
controller.doSearch(filter, 'any');
|
controller.doSearch(filter, 'any');
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
|
|
||||||
expect(controller.onSearch).toHaveBeenCalledWith({$params: filter});
|
expect(controller.onSearch).toHaveBeenCalledWith({$params: filter}, 'any');
|
||||||
expect(controller.onFilter).toHaveBeenCalledWith(filter, 'any', undefined);
|
expect(controller.onFilter).toHaveBeenCalledWith(filter, 'any', undefined);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -290,5 +290,7 @@
|
||||||
"isTaxDataChecked": "Datos comprobados",
|
"isTaxDataChecked": "Datos comprobados",
|
||||||
"comercialId": "Id comercial",
|
"comercialId": "Id comercial",
|
||||||
"comercialName": "Comercial",
|
"comercialName": "Comercial",
|
||||||
"Invalid NIF for VIES": "Invalid NIF for VIES"
|
"Invalid NIF for VIES": "Invalid NIF for VIES",
|
||||||
|
"Ticket does not exist": "Este ticket no existe",
|
||||||
|
"Ticket is already signed": "Este ticket ya ha sido firmado"
|
||||||
}
|
}
|
|
@ -67,9 +67,13 @@ module.exports = Self => {
|
||||||
uw.id workerFk,
|
uw.id workerFk,
|
||||||
uw.name workerName,
|
uw.name workerName,
|
||||||
c.creditInsurance,
|
c.creditInsurance,
|
||||||
d.defaulterSinced
|
d.defaulterSinced,
|
||||||
|
cn.country,
|
||||||
|
pm.name payMethod
|
||||||
FROM vn.defaulter d
|
FROM vn.defaulter d
|
||||||
JOIN vn.client c ON c.id = d.clientFk
|
JOIN vn.client c ON c.id = d.clientFk
|
||||||
|
JOIN vn.country cn ON cn.id = c.countryFk
|
||||||
|
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
|
||||||
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
||||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||||
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
||||||
|
|
|
@ -29,6 +29,16 @@
|
||||||
"type": "belongsTo",
|
"type": "belongsTo",
|
||||||
"model": "Client",
|
"model": "Client",
|
||||||
"foreignKey": "clientFk"
|
"foreignKey": "clientFk"
|
||||||
|
},
|
||||||
|
"country": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Country",
|
||||||
|
"foreignKey": "country"
|
||||||
|
},
|
||||||
|
"payMethod": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "PayMethod",
|
||||||
|
"foreignKey": "payMethod"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -57,6 +57,13 @@
|
||||||
<th field="salesPersonFk">
|
<th field="salesPersonFk">
|
||||||
<span translate>Comercial</span>
|
<span translate>Comercial</span>
|
||||||
</th>
|
</th>
|
||||||
|
<th field="country">
|
||||||
|
<span translate>Country</span>
|
||||||
|
</th>
|
||||||
|
<th field="payMethod"
|
||||||
|
vn-tooltip="Pay Method">
|
||||||
|
<span translate>P.Method</span>
|
||||||
|
</th>
|
||||||
<th
|
<th
|
||||||
field="amount"
|
field="amount"
|
||||||
vn-tooltip="Balance due">
|
vn-tooltip="Balance due">
|
||||||
|
@ -111,6 +118,12 @@
|
||||||
{{::defaulter.salesPersonName | dashIfEmpty}}
|
{{::defaulter.salesPersonName | dashIfEmpty}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
{{::defaulter.country}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{::defaulter.payMethod}}
|
||||||
|
</td>
|
||||||
<td>{{::defaulter.amount | currency: 'EUR': 2}}</td>
|
<td>{{::defaulter.amount | currency: 'EUR': 2}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
|
|
|
@ -20,8 +20,7 @@ export default class Controller extends Section {
|
||||||
showField: 'name',
|
showField: 'name',
|
||||||
valueField: 'id'
|
valueField: 'id'
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
field: 'salesPersonFk',
|
field: 'salesPersonFk',
|
||||||
autocomplete: {
|
autocomplete: {
|
||||||
url: 'Workers/activeWithInheritedRole',
|
url: 'Workers/activeWithInheritedRole',
|
||||||
|
@ -30,6 +29,18 @@ export default class Controller extends Section {
|
||||||
showField: 'name',
|
showField: 'name',
|
||||||
valueField: 'id',
|
valueField: 'id',
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
field: 'country',
|
||||||
|
autocomplete: {
|
||||||
|
showField: 'country',
|
||||||
|
valueField: 'country'
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
field: 'payMethodFk',
|
||||||
|
autocomplete: {
|
||||||
|
showField: 'name',
|
||||||
|
valueField: 'id'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'workerFk',
|
field: 'workerFk',
|
||||||
|
@ -132,7 +143,7 @@ export default class Controller extends Section {
|
||||||
sendMail() {
|
sendMail() {
|
||||||
const params = {
|
const params = {
|
||||||
defaulters: this.checked,
|
defaulters: this.checked,
|
||||||
observation: this.defaulter.observation
|
observation: this.defaulter.observation,
|
||||||
};
|
};
|
||||||
this.$http.post(`Defaulters/observationEmail`, params);
|
this.$http.post(`Defaulters/observationEmail`, params);
|
||||||
}
|
}
|
||||||
|
@ -143,6 +154,8 @@ export default class Controller extends Section {
|
||||||
case 'amount':
|
case 'amount':
|
||||||
case 'clientFk':
|
case 'clientFk':
|
||||||
case 'workerFk':
|
case 'workerFk':
|
||||||
|
case 'country':
|
||||||
|
case 'payMethod':
|
||||||
case 'salesPersonFk':
|
case 'salesPersonFk':
|
||||||
return {[`d.${param}`]: value};
|
return {[`d.${param}`]: value};
|
||||||
case 'created':
|
case 'created':
|
||||||
|
|
|
@ -9,3 +9,6 @@ Search client: Buscar clientes
|
||||||
Worker who made the last observation: Trabajador que ha realizado la última observación
|
Worker who made the last observation: Trabajador que ha realizado la última observación
|
||||||
Email sended!: Email enviado!
|
Email sended!: Email enviado!
|
||||||
Observation saved!: Observación añadida!
|
Observation saved!: Observación añadida!
|
||||||
|
P.Method: F.Pago
|
||||||
|
Pay Method: Forma de Pago
|
||||||
|
Country: Pais
|
|
@ -27,7 +27,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
const where = filter.where;
|
const where = filter.where;
|
||||||
const query = 'CALL vn.item_getBalance(?, ?, ?)';
|
const query = 'CALL vn.item_getBalance(?, ?, ?)';
|
||||||
const [diary] = await Self.rawSql(query, [where.itemFk, where.warehouseFk, null], myOptions);
|
const [diary] = await Self.rawSql(query, [where.itemFk, where.warehouseFk, where.date], myOptions);
|
||||||
|
|
||||||
for (const entry of diary)
|
for (const entry of diary)
|
||||||
if (entry.clientType === 'loses') entry.highlighted = true;
|
if (entry.clientType === 'loses') entry.highlighted = true;
|
||||||
|
|
|
@ -21,7 +21,8 @@ describe('item getBalance()', () => {
|
||||||
const filter = {
|
const filter = {
|
||||||
where: {
|
where: {
|
||||||
itemFk: 1,
|
itemFk: 1,
|
||||||
warehouseFk: 1
|
warehouseFk: 1,
|
||||||
|
date: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const results = await models.Item.getBalance(filter, options);
|
const results = await models.Item.getBalance(filter, options);
|
||||||
|
@ -45,14 +46,16 @@ describe('item getBalance()', () => {
|
||||||
const firstFilter = {
|
const firstFilter = {
|
||||||
where: {
|
where: {
|
||||||
itemFk: 1,
|
itemFk: 1,
|
||||||
warehouseFk: 1
|
warehouseFk: 1,
|
||||||
|
date: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const secondFilter = {
|
const secondFilter = {
|
||||||
where: {
|
where: {
|
||||||
itemFk: 2,
|
itemFk: 2,
|
||||||
warehouseFk: 1
|
warehouseFk: 1,
|
||||||
|
date: null
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,16 @@
|
||||||
ng-model="$ctrl.warehouseFk"
|
ng-model="$ctrl.warehouseFk"
|
||||||
label="Select warehouse">
|
label="Select warehouse">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
|
<vn-check
|
||||||
|
ng-class="{'table-check':$ctrl.showOld}"
|
||||||
|
label="Show what's before the inventory"
|
||||||
|
ng-model="$ctrl.showOld">
|
||||||
|
</vn-check>
|
||||||
|
<vn-date-picker
|
||||||
|
label="Since"
|
||||||
|
ng-model="$ctrl.date"
|
||||||
|
ng-show="$ctrl.showOld">
|
||||||
|
</vn-date-picker>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-table model="model">
|
<vn-table model="model">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
|
|
|
@ -38,12 +38,8 @@ class Controller extends Section {
|
||||||
if (value && value != this._warehouseFk) {
|
if (value && value != this._warehouseFk) {
|
||||||
this._warehouseFk = value;
|
this._warehouseFk = value;
|
||||||
this.card.warehouseFk = value;
|
this.card.warehouseFk = value;
|
||||||
|
this.filter.where.warehouseFk = this.warehouseFk;
|
||||||
|
|
||||||
this.$state.go(this.$state.current.name, {
|
|
||||||
warehouseFk: value
|
|
||||||
});
|
|
||||||
|
|
||||||
this.filter.where.warehouseFk = value;
|
|
||||||
this.$.model.refresh();
|
this.$.model.refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,6 +48,28 @@ class Controller extends Section {
|
||||||
return this._warehouseFk;
|
return this._warehouseFk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set date(value) {
|
||||||
|
this._date = value;
|
||||||
|
this.filter.where.date = value;
|
||||||
|
this.filter.where.warehouseFk = this.warehouseFk;
|
||||||
|
|
||||||
|
this.$.model.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
get date() {
|
||||||
|
return this._date;
|
||||||
|
}
|
||||||
|
|
||||||
|
set showOld(value) {
|
||||||
|
this._showOld = value;
|
||||||
|
if (!this._showOld) this.date = null;
|
||||||
|
else this.date = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
get showOld() {
|
||||||
|
return this._showOld;
|
||||||
|
}
|
||||||
|
|
||||||
scrollToLine(lineFk) {
|
scrollToLine(lineFk) {
|
||||||
this.$.$applyAsync(() => {
|
this.$.$applyAsync(() => {
|
||||||
const hashFk = this.lineFk || lineFk;
|
const hashFk = this.lineFk || lineFk;
|
||||||
|
|
|
@ -2,3 +2,4 @@ In: Entrada
|
||||||
Out: Salida
|
Out: Salida
|
||||||
Visible quantity: Cantidad visible
|
Visible quantity: Cantidad visible
|
||||||
Ticket/Entry: Ticket/Entrada
|
Ticket/Entry: Ticket/Entrada
|
||||||
|
Show what's before the inventory: Mostrar lo anterior al inventario
|
||||||
|
|
|
@ -27,4 +27,7 @@ vn-item-diary {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
.table-check{
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -2,8 +2,8 @@
|
||||||
vn-fixed-price{
|
vn-fixed-price{
|
||||||
smart-table table{
|
smart-table table{
|
||||||
[shrink-field]{
|
[shrink-field]{
|
||||||
width: 80px;
|
width: 90px;
|
||||||
max-width: 80px;
|
max-width: 90px;
|
||||||
}
|
}
|
||||||
[shrink-field-expand]{
|
[shrink-field-expand]{
|
||||||
width: 150px;
|
width: 150px;
|
||||||
|
@ -15,8 +15,8 @@ vn-fixed-price{
|
||||||
align-items: center;
|
align-items: center;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vn-input-number {
|
vn-input-number {
|
||||||
width: 90px;
|
width: 75px;
|
||||||
max-width: 90px;
|
max-width: 75px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="Routes/filter"
|
url="Routes/filter"
|
||||||
limit="20"
|
limit="20"
|
||||||
order="created DESC">
|
order="created DESC, id DESC">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<vn-portal slot="topbar">
|
<vn-portal slot="topbar">
|
||||||
<vn-searchbar
|
<vn-searchbar
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethodCtx('editableStates', {
|
Self.remoteMethodCtx('editableStates', {
|
||||||
description: 'Gets the editable states according the user role ',
|
description: 'Gets the editable states according the user role ',
|
||||||
|
@ -19,25 +20,16 @@ module.exports = Self => {
|
||||||
Self.editableStates = async(ctx, filter, options) => {
|
Self.editableStates = async(ctx, filter, options) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const userId = ctx.req.accessToken.userId;
|
const userId = ctx.req.accessToken.userId;
|
||||||
const myOptions = {};
|
const myOptions = {...(options || {})};
|
||||||
|
|
||||||
if (typeof options == 'object')
|
|
||||||
Object.assign(myOptions, options);
|
|
||||||
|
|
||||||
let statesList = await models.State.find(filter, myOptions);
|
|
||||||
const isProduction = await models.VnUser.hasRole(userId, 'production', myOptions);
|
const isProduction = await models.VnUser.hasRole(userId, 'production', myOptions);
|
||||||
const isSalesPerson = await models.VnUser.hasRole(userId, 'salesPerson', myOptions);
|
|
||||||
const isAdministrative = await models.VnUser.hasRole(userId, 'administrative', myOptions);
|
const isAdministrative = await models.VnUser.hasRole(userId, 'administrative', myOptions);
|
||||||
|
|
||||||
if (isProduction || isAdministrative)
|
if (!isProduction && !isAdministrative)
|
||||||
return statesList;
|
filter = mergeFilters(filter, {where: {alertLevel: 0}});
|
||||||
|
|
||||||
if (isSalesPerson) {
|
const states = await models.State.find(filter, myOptions);
|
||||||
return statesList = statesList.filter(stateList =>
|
|
||||||
stateList.alertLevel === 0 || stateList.code === 'PICKER_DESIGNED'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return statesList.filter(stateList => stateList.alertLevel === 0);
|
return states;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,31 +24,6 @@ describe('ticket editableStates()', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should return the expected states by a specific role`, async() => {
|
|
||||||
const tx = await models.State.beginTransaction({});
|
|
||||||
|
|
||||||
try {
|
|
||||||
const options = {transaction: tx};
|
|
||||||
|
|
||||||
const productionRole = 18;
|
|
||||||
const ctx = {req: {accessToken: {userId: productionRole}}};
|
|
||||||
|
|
||||||
const editableStates = await models.State.editableStates(ctx, filter, options);
|
|
||||||
|
|
||||||
const deliveredState = editableStates.some(state => state.code == 'DELIVERED');
|
|
||||||
|
|
||||||
const pickerDesignedState = editableStates.some(state => state.code == 'PICKER_DESIGNED');
|
|
||||||
|
|
||||||
expect(deliveredState).toBeFalsy();
|
|
||||||
expect(pickerDesignedState).toBeTruthy();
|
|
||||||
|
|
||||||
await tx.rollback();
|
|
||||||
} catch (e) {
|
|
||||||
await tx.rollback();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should return again the expected state by a specific role`, async() => {
|
it(`should return again the expected state by a specific role`, async() => {
|
||||||
const tx = await models.State.beginTransaction({});
|
const tx = await models.State.beginTransaction({});
|
||||||
|
|
||||||
|
@ -70,4 +45,25 @@ describe('ticket editableStates()', () => {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it(`should return the expected state matching with the name`, async() => {
|
||||||
|
const tx = await models.State.beginTransaction({});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
const employeeRole = 1;
|
||||||
|
const ctx = {req: {accessToken: {userId: employeeRole}}};
|
||||||
|
const filter = {where: {name: {like: '%Previa OK%'}}};
|
||||||
|
|
||||||
|
const [editableStates] = await models.State.editableStates(ctx, filter, options);
|
||||||
|
|
||||||
|
expect(editableStates.name).toBe('Previa OK');
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -29,8 +29,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.saveSign = async(ctx, options) => {
|
Self.saveSign = async(ctx, tickets, location, signedTime, options) => {
|
||||||
const args = Object.assign({}, ctx.args);
|
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const myOptions = {};
|
const myOptions = {};
|
||||||
let tx;
|
let tx;
|
||||||
|
@ -48,9 +47,9 @@ module.exports = Self => {
|
||||||
async function setLocation(ticketId) {
|
async function setLocation(ticketId) {
|
||||||
await models.Delivery.create({
|
await models.Delivery.create({
|
||||||
ticketFk: ticketId,
|
ticketFk: ticketId,
|
||||||
longitude: args.location.Longitude,
|
longitude: location.Longitude,
|
||||||
latitude: args.location.Latitude,
|
latitude: location.Latitude,
|
||||||
dated: args.signedTime || new Date()
|
dated: signedTime || new Date()
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,9 +106,9 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (let i = 0; i < args.tickets.length; i++) {
|
for (const ticketId of tickets) {
|
||||||
const ticketState = await models.TicketState.findOne(
|
const ticketState = await models.TicketState.findOne(
|
||||||
{where: {ticketFk: args.tickets[i]},
|
{where: {ticketFk: ticketId},
|
||||||
fields: ['alertLevel']
|
fields: ['alertLevel']
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
|
@ -117,16 +116,19 @@ module.exports = Self => {
|
||||||
fields: ['id']
|
fields: ['id']
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
|
if (!ticketState)
|
||||||
|
throw new UserError('Ticket does not exist');
|
||||||
if (ticketState.alertLevel < packedAlertLevel.id)
|
if (ticketState.alertLevel < packedAlertLevel.id)
|
||||||
throw new UserError('This ticket cannot be signed because it has not been boxed');
|
throw new UserError('This ticket cannot be signed because it has not been boxed');
|
||||||
else if (!await gestDocExists(args.tickets[i])) {
|
if (await gestDocExists(ticketId))
|
||||||
if (args.location) setLocation(args.tickets[i]);
|
throw new UserError('Ticket is already signed');
|
||||||
if (!gestDocCreated) await createGestDoc(args.tickets[i]);
|
|
||||||
await models.TicketDms.create({ticketFk: args.tickets[i], dmsFk: dms[0].id}, myOptions);
|
if (location) setLocation(ticketId);
|
||||||
const ticket = await models.Ticket.findById(args.tickets[i], null, myOptions);
|
if (!gestDocCreated) await createGestDoc(ticketId);
|
||||||
await ticket.updateAttribute('isSigned', true, myOptions);
|
await models.TicketDms.create({ticketFk: ticketId, dmsFk: dms[0].id}, myOptions);
|
||||||
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [args.tickets[i], 'DELIVERED'], myOptions);
|
const ticket = await models.Ticket.findById(ticketId, null, myOptions);
|
||||||
}
|
await ticket.updateAttribute('isSigned', true, myOptions);
|
||||||
|
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticketId, 'DELIVERED'], myOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -78,7 +78,7 @@ module.exports = Self => {
|
||||||
const saleIds = sales.map(sale => sale.id);
|
const saleIds = sales.map(sale => sale.id);
|
||||||
|
|
||||||
const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
|
const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}});
|
||||||
if (hasClaimedSales)
|
if (ticketId != id && hasClaimedSales)
|
||||||
throw new UserError(`Can't transfer claimed sales`);
|
throw new UserError(`Can't transfer claimed sales`);
|
||||||
|
|
||||||
for (const sale of sales) {
|
for (const sale of sales) {
|
||||||
|
|
|
@ -122,7 +122,7 @@
|
||||||
<td>{{::ticket.ipt | dashIfEmpty}}</td>
|
<td>{{::ticket.ipt | dashIfEmpty}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
class="chip {{$ctrl.stateColor(ticket.state)}}">
|
class="chip {{ticket.classColor}}">
|
||||||
{{::ticket.state | dashIfEmpty}}
|
{{::ticket.state | dashIfEmpty}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
@ -150,7 +150,7 @@
|
||||||
<td>{{::ticket.futureIpt | dashIfEmpty}}</td>
|
<td>{{::ticket.futureIpt | dashIfEmpty}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
class="chip {{$ctrl.stateColor(ticket.futureState)}}">
|
class="chip {{ticket.classColor}}">
|
||||||
{{::ticket.futureState | dashIfEmpty}}
|
{{::ticket.futureState | dashIfEmpty}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -137,7 +137,7 @@
|
||||||
<td>{{::ticket.ipt | dashIfEmpty}}</td>
|
<td>{{::ticket.ipt | dashIfEmpty}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
class="chip {{$ctrl.stateColor(ticket.state)}}">
|
class="chip {{ticket.classColor}}">
|
||||||
{{::ticket.state}}
|
{{::ticket.state}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
@ -158,7 +158,7 @@
|
||||||
<td>{{::ticket.futureIpt | dashIfEmpty}}</td>
|
<td>{{::ticket.futureIpt | dashIfEmpty}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
class="chip {{$ctrl.stateColor(ticket.futureState)}}">
|
class="chip {{ticket.classColor}}">
|
||||||
{{::ticket.futureState}}
|
{{::ticket.futureState}}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -95,13 +95,6 @@ export default class Controller extends Section {
|
||||||
return checkedLines;
|
return checkedLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
stateColor(state) {
|
|
||||||
if (state === 'OK')
|
|
||||||
return 'success';
|
|
||||||
else if (state === 'Libre')
|
|
||||||
return 'notice';
|
|
||||||
}
|
|
||||||
|
|
||||||
dateRange(value) {
|
dateRange(value) {
|
||||||
const minHour = new Date(value);
|
const minHour = new Date(value);
|
||||||
minHour.setHours(0, 0, 0, 0);
|
minHour.setHours(0, 0, 0, 0);
|
||||||
|
|
|
@ -60,24 +60,6 @@ describe('Component vnTicketFuture', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('stateColor()', () => {
|
|
||||||
it('should return success to the OK tickets', () => {
|
|
||||||
const ok = controller.stateColor(controller.$.model.data[0].state);
|
|
||||||
const notOk = controller.stateColor(controller.$.model.data[1].state);
|
|
||||||
|
|
||||||
expect(ok).toEqual('success');
|
|
||||||
expect(notOk).not.toEqual('success');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return success to the FREE tickets', () => {
|
|
||||||
const notFree = controller.stateColor(controller.$.model.data[0].state);
|
|
||||||
const free = controller.stateColor(controller.$.model.data[1].state);
|
|
||||||
|
|
||||||
expect(free).toEqual('notice');
|
|
||||||
expect(notFree).not.toEqual('notice');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('dateRange()', () => {
|
describe('dateRange()', () => {
|
||||||
it('should return two dates with the hours at the start and end of the given date', () => {
|
it('should return two dates with the hours at the start and end of the given date', () => {
|
||||||
const dateRange = controller.dateRange(today);
|
const dateRange = controller.dateRange(today);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
import ModuleMain from 'salix/components/module-main';
|
import ModuleMain from 'salix/components/module-main';
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
export default class Ticket extends ModuleMain {
|
export default class Ticket extends ModuleMain {
|
||||||
fetchParams($params) {
|
fetchParams($params) {
|
||||||
|
@ -14,10 +15,19 @@ export default class Ticket extends ModuleMain {
|
||||||
'scopeDays'
|
'scopeDays'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const seachPanelParams = Object.entries($params);
|
||||||
|
const hasFromParam = seachPanelParams.some(subarray => subarray.length > 0 && subarray[0] === 'from');
|
||||||
|
const hasToParam = seachPanelParams.some(subarray => subarray.length > 0 && subarray[0] === 'to');
|
||||||
|
|
||||||
|
if ((hasFromParam && !hasToParam) || (!hasFromParam && hasToParam))
|
||||||
|
throw new UserError(`Date range must have 'from' and 'to'`);
|
||||||
|
|
||||||
const hasExcludedParams = excludedParams.some(param => {
|
const hasExcludedParams = excludedParams.some(param => {
|
||||||
return $params && $params[param] != undefined;
|
return $params && $params[param] != undefined;
|
||||||
});
|
});
|
||||||
|
|
||||||
const hasParams = Object.entries($params).length;
|
const hasParams = Object.entries($params).length;
|
||||||
|
|
||||||
if (!hasParams || !hasExcludedParams)
|
if (!hasParams || !hasExcludedParams)
|
||||||
$params.scopeDays = 1;
|
$params.scopeDays = 1;
|
||||||
|
|
||||||
|
@ -28,7 +38,6 @@ export default class Ticket extends ModuleMain {
|
||||||
const to = new Date(from.getTime());
|
const to = new Date(from.getTime());
|
||||||
to.setDate(to.getDate() + $params.scopeDays);
|
to.setDate(to.getDate() + $params.scopeDays);
|
||||||
to.setHours(23, 59, 59, 999);
|
to.setHours(23, 59, 59, 999);
|
||||||
|
|
||||||
Object.assign($params, {from, to});
|
Object.assign($params, {from, to});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Date range must have 'from' and 'to': El rango de fechas debe tener 'desde' y 'hasta'
|
|
@ -488,6 +488,12 @@
|
||||||
on-accept="$ctrl.onCreateClaimAccepted()">
|
on-accept="$ctrl.onCreateClaimAccepted()">
|
||||||
</vn-confirm>
|
</vn-confirm>
|
||||||
|
|
||||||
|
<vn-confirm
|
||||||
|
vn-id="claimSure"
|
||||||
|
message="Do you want to create a claim?"
|
||||||
|
on-accept="$ctrl.createClaim()">
|
||||||
|
</vn-confirm>
|
||||||
|
|
||||||
<vn-menu vn-id="moreOptions">
|
<vn-menu vn-id="moreOptions">
|
||||||
<vn-item translate
|
<vn-item translate
|
||||||
name="sms"
|
name="sms"
|
||||||
|
@ -507,10 +513,9 @@
|
||||||
</vn-item>
|
</vn-item>
|
||||||
<vn-item translate
|
<vn-item translate
|
||||||
name="claim"
|
name="claim"
|
||||||
ng-click="$ctrl.createClaim()"
|
ng-click="claimSure.show()"
|
||||||
ng-if="$ctrl.isClaimable">
|
ng-if="$ctrl.isClaimable">
|
||||||
Add claim
|
Add claim
|
||||||
|
|
||||||
</vn-item>
|
</vn-item>
|
||||||
<vn-item translate
|
<vn-item translate
|
||||||
name="reserve"
|
name="reserve"
|
||||||
|
|
|
@ -244,7 +244,12 @@ class Controller extends Section {
|
||||||
|
|
||||||
const query = `tickets/${this.ticket.id}/transferSales`;
|
const query = `tickets/${this.ticket.id}/transferSales`;
|
||||||
this.$http.post(query, params)
|
this.$http.post(query, params)
|
||||||
.then(res => this.$state.go('ticket.card.sale', {id: res.data.id}));
|
.then(res => {
|
||||||
|
if (res.data && res.data.id === this.ticket.id) {
|
||||||
|
this.$.transfer.hide();
|
||||||
|
this.$.model.refresh();
|
||||||
|
} else this.$state.go('ticket.card.sale', {id: res.data.id});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
showEditPricePopover(event, sale) {
|
showEditPricePopover(event, sale) {
|
||||||
|
|
|
@ -42,3 +42,4 @@ Claim mana: Maná reclamación
|
||||||
History: Historial
|
History: Historial
|
||||||
Do you want to continue?: ¿Desea continuar?
|
Do you want to continue?: ¿Desea continuar?
|
||||||
Claim out of time: Reclamación fuera de plazo
|
Claim out of time: Reclamación fuera de plazo
|
||||||
|
Do you want to create a claim?: ¿Quieres crear una reclamación?
|
|
@ -54,18 +54,6 @@ module.exports = Self => {
|
||||||
description: `The worker province`,
|
description: `The worker province`,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
arg: 'iban',
|
|
||||||
type: 'string',
|
|
||||||
description: `The worker iban`,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
arg: 'bankEntityFk',
|
|
||||||
type: 'number',
|
|
||||||
description: `The worker bank entity`,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
arg: 'companyFk',
|
arg: 'companyFk',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
|
@ -101,6 +89,22 @@ module.exports = Self => {
|
||||||
type: 'date',
|
type: 'date',
|
||||||
description: `The worker birth`,
|
description: `The worker birth`,
|
||||||
required: true,
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'payMethodFk',
|
||||||
|
type: 'number',
|
||||||
|
description: `The client payMethod`,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'iban',
|
||||||
|
type: 'string',
|
||||||
|
description: `The client iban`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'bankEntityFk',
|
||||||
|
type: 'number',
|
||||||
|
description: `The client bank entity`,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
|
@ -162,6 +166,10 @@ module.exports = Self => {
|
||||||
myOptions
|
myOptions
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const payMethod = await models.PayMethod.findById(args.payMethodFk, {fields: ['isIbanRequiredForClients']});
|
||||||
|
if (payMethod.isIbanRequiredForClients && !args.iban)
|
||||||
|
throw new UserError(`That payment method requires an IBAN`);
|
||||||
|
|
||||||
await models.Worker.rawSql(
|
await models.Worker.rawSql(
|
||||||
'CALL vn.clientCreate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
'CALL vn.clientCreate(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
|
||||||
[
|
[
|
||||||
|
@ -202,6 +210,7 @@ module.exports = Self => {
|
||||||
|
|
||||||
await client.updateAttributes(
|
await client.updateAttributes(
|
||||||
{
|
{
|
||||||
|
payMethod: args.payMethod,
|
||||||
iban: args.iban,
|
iban: args.iban,
|
||||||
bankEntityFk: args.bankEntityFk,
|
bankEntityFk: args.bankEntityFk,
|
||||||
defaultAddressFk: address.id,
|
defaultAddressFk: address.id,
|
||||||
|
|
|
@ -27,14 +27,14 @@ describe('Worker new', () => {
|
||||||
street: 'S/ defaultWorkerStreet',
|
street: 'S/ defaultWorkerStreet',
|
||||||
city: 'defaultWorkerCity',
|
city: 'defaultWorkerCity',
|
||||||
provinceFk: 1,
|
provinceFk: 1,
|
||||||
iban: 'ES8304879798578129532677',
|
|
||||||
bankEntityFk: 128,
|
|
||||||
companyFk: 442,
|
companyFk: 442,
|
||||||
postcode: '46680',
|
postcode: '46680',
|
||||||
phone: '123456789',
|
phone: '123456789',
|
||||||
code: 'DWW',
|
code: 'DWW',
|
||||||
bossFk: 9,
|
bossFk: 9,
|
||||||
birth: '2022-12-11T23:00:00.000Z'
|
birth: '2022-12-11T23:00:00.000Z',
|
||||||
|
payMethodFk: 1,
|
||||||
|
roleFk: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
it('should return error if personal mail already exists', async() => {
|
it('should return error if personal mail already exists', async() => {
|
||||||
|
@ -105,6 +105,33 @@ describe('Worker new', () => {
|
||||||
expect(error.message).toEqual('This worker already exists');
|
expect(error.message).toEqual('This worker already exists');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return error if payMethod require iban', async() => {
|
||||||
|
const payMethodIbanRequired = await models.PayMethod.findOne({
|
||||||
|
where: {
|
||||||
|
isIbanRequiredForClients: true
|
||||||
|
},
|
||||||
|
fields: ['id']
|
||||||
|
});
|
||||||
|
|
||||||
|
const tx = await models.Worker.beginTransaction({});
|
||||||
|
|
||||||
|
let error;
|
||||||
|
try {
|
||||||
|
const options = {transaction: tx};
|
||||||
|
const ctx = {
|
||||||
|
args: Object.assign({}, defaultWorker, {payMethodFk: payMethodIbanRequired.id})
|
||||||
|
};
|
||||||
|
await models.Worker.new(ctx, options);
|
||||||
|
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (e) {
|
||||||
|
error = e;
|
||||||
|
await tx.rollback();
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(error.message).toEqual('That payment method requires an IBAN');
|
||||||
|
});
|
||||||
|
|
||||||
it('should create a new worker', async() => {
|
it('should create a new worker', async() => {
|
||||||
const newWorker = await models.Worker.new({args: defaultWorker});
|
const newWorker = await models.Worker.new({args: defaultWorker});
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
"roleFk": {
|
"roleFk": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
},
|
},
|
||||||
|
"payMethodFk": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
"businessTypeFk": {
|
"businessTypeFk": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,12 +142,19 @@
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
label="Pay method"
|
||||||
|
url="Paymethods"
|
||||||
|
ng-model="$ctrl.worker.payMethodFk"
|
||||||
|
initial-data="$ctrl.workerConfig.payMethodFk">
|
||||||
|
</vn-autocomplete>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
label="IBAN"
|
label="IBAN"
|
||||||
ng-model="$ctrl.worker.iban"
|
ng-model="$ctrl.worker.iban"
|
||||||
rule
|
on-change="$ctrl.autofillBic()"
|
||||||
on-change="$ctrl.autofillBic()">
|
rule>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
|
|
|
@ -5,9 +5,17 @@ export default class Controller extends Section {
|
||||||
constructor($element, $) {
|
constructor($element, $) {
|
||||||
super($element, $);
|
super($element, $);
|
||||||
this.worker = {companyFk: this.vnConfig.user.companyFk};
|
this.worker = {companyFk: this.vnConfig.user.companyFk};
|
||||||
|
this.$http.get(`WorkerConfigs/findOne`, {field: ['payMethodFk']}).then(res => {
|
||||||
|
if (res.data) this.worker.payMethodFk = res.data.payMethodFk;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
|
if (!this.worker.iban && !this.worker.bankEntityFk) {
|
||||||
|
delete this.worker.iban;
|
||||||
|
delete this.worker.bankEntityFk;
|
||||||
|
}
|
||||||
|
|
||||||
return this.$.watcher.submit().then(json => {
|
return this.$.watcher.submit().then(json => {
|
||||||
this.$state.go('worker.card.basicData', {id: json.data.id});
|
this.$state.go('worker.card.basicData', {id: json.data.id});
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,3 +10,4 @@ Street: Dirección
|
||||||
Postcode: Código postal
|
Postcode: Código postal
|
||||||
Web user: Usuario Web
|
Web user: Usuario Web
|
||||||
Access permission: Permiso de acceso
|
Access permission: Permiso de acceso
|
||||||
|
Pay method: Método de pago
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.18.01",
|
"version": "23.22.01",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.20.01",
|
"version": "23.22.01",
|
||||||
"author": "Verdnatura Levante SL",
|
"author": "Verdnatura Levante SL",
|
||||||
"description": "Salix backend",
|
"description": "Salix backend",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
|
|
Loading…
Reference in New Issue