diff --git a/db/changes/10400-christmas/00-ticket_getVisibleAvailable.sql b/db/changes/10400-christmas/00-ticket_getVisibleAvailable.sql
deleted file mode 100644
index 6151b786d..000000000
--- a/db/changes/10400-christmas/00-ticket_getVisibleAvailable.sql
+++ /dev/null
@@ -1,50 +0,0 @@
-DROP PROCEDURE IF EXISTS `vn`.`ticket_getVisibleAvailable`;
-
-DELIMITER $$
-$$
-CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`ticket_getVisibleAvailable`(`vTicket` INT, `vDate` DATE)
-BEGIN
- DECLARE vVisibleCalc INT;
- DECLARE vAvailableCalc INT;
- DECLARE vShipped DATE;
- DECLARE vWarehouse TINYINT;
- DECLARE vAlertLevel INT;
-
- SELECT t.warehouseFk, t.shipped, ts.alertLevel
- INTO vWarehouse, vShipped, vAlertLevel
- FROM ticket t
- LEFT JOIN ticketState ts ON ts.ticketFk = vTicket
- WHERE t.id = vTicket;
-
- IF vDate IS NULL THEN
- SET vDate = vShipped;
- END IF;
-
- IF vAlertLevel IS NULL OR vAlertLevel = 0 THEN
- IF vDate >= CURDATE() THEN
- CALL cache.available_refresh(vAvailableCalc, FALSE, vWarehouse, vDate);
- END IF;
- IF vDate = CURDATE() THEN
- CALL cache.visible_refresh(vVisibleCalc, FALSE, vWarehouse);
- END IF;
- END IF;
-
- SELECT s.id,
- s.itemFk,
- s.quantity,
- s.concept,
- s.price,
- s.reserved,
- s.discount,
- v.visible,
- av.available,
- it.image,
- it.subName
- FROM sale s
- LEFT JOIN cache.visible v ON v.item_id = s.itemFk AND v.calc_id = vVisibleCalc
- LEFT JOIN cache.available av ON av.item_id = s.itemFk AND av.calc_id = vAvailableCalc
- LEFT JOIN item it ON it.id = s.itemFk
- WHERE s.ticketFk = vTicket
- ORDER BY s.concept;
-END$$
-DELIMITER ;
diff --git a/db/changes/10400-christmas/01-ticketGetVisibleAvailable.sql b/db/changes/10400-christmas/01-ticketGetVisibleAvailable.sql
deleted file mode 100644
index fc2429e72..000000000
--- a/db/changes/10400-christmas/01-ticketGetVisibleAvailable.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-DROP PROCEDURE IF EXISTS `vn`.`ticketGetVisibleAvailable`;
-
-DELIMITER $$
-$$
-CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`ticketGetVisibleAvailable`(`vTicket` INT)
-BEGIN
- CALL `ticket_getVisibleAvailable`(vTicket, null);
-END$$
-DELIMITER ;
-
\ No newline at end of file
diff --git a/db/changes/10410-january/00-ticket_getAdvancable.sql b/db/changes/10410-january/00-ticket_getAdvancable.sql
new file mode 100644
index 000000000..b8d9337e3
--- /dev/null
+++ b/db/changes/10410-january/00-ticket_getAdvancable.sql
@@ -0,0 +1,43 @@
+DROP PROCEDURE IF EXISTS `vn`.`ticket_getAdvanceable`;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`ticket_getAdvanceable`(vTicketFk INT, vDatedNew DATETIME, vWarehouseFk INT)
+BEGIN
+/**
+ * Cálcula el stock avanzable para los artículos de un ticket
+ *
+ * @param vTicketFk -> Ticket
+ * @param vDatedNew -> Nueva fecha
+ * @return Sales con Avanzable
+*/
+ DECLARE vDatedOld DATETIME;
+
+ SELECT t.shipped INTO vDatedOld
+ FROM ticket t
+ WHERE t.id = vTicketFk;
+
+ CALL itemStock(vWarehouseFk, DATE_SUB(vDatedNew, INTERVAL 1 DAY), NULL);
+ CALL item_getMinacum(vWarehouseFk, vDatedNew, DATEDIFF(vDatedOld, vDatedNew), NULL);
+
+ SELECT s.id,
+ s.itemFk,
+ s.quantity,
+ s.concept,
+ s.price,
+ s.reserved,
+ s.discount,
+ i.image,
+ i.subName,
+ il.stock + IFNULL(im.amount, 0) AS advanceable
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ LEFT JOIN tmp.itemMinacum im ON im.itemFk = s.itemFk AND im.warehouseFk = vWarehouseFk
+ LEFT JOIN tmp.itemList il ON il.itemFk = s.itemFk
+ WHERE t.id = vTicketFk;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp.itemList;
+ DROP TEMPORARY TABLE IF EXISTS tmp.itemMinacum;
+END$$
+DELIMITER ;
diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js
index 6ae702979..93c6bba65 100644
--- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js
+++ b/e2e/paths/05-ticket/06_basic_data_steps.spec.js
@@ -8,7 +8,7 @@ describe('Ticket Edit basic data path', () => {
beforeAll(async() => {
browser = await getBrowser();
page = browser.page;
- await page.loginAndModule('employee', 'ticket');
+ await page.loginAndModule('employee', 'ticket');
await page.accessToSearchResult('11');
await page.accessToSection('ticket.card.basicData.stepOne');
});
@@ -85,7 +85,7 @@ describe('Ticket Edit basic data path', () => {
});
it(`should not find ticket`, async() => {
- await page.doSearch('28');
+ await page.doSearch('29');
const count = await page.countElement(selectors.ticketsIndex.searchResult);
expect(count).toEqual(0);
@@ -128,8 +128,8 @@ describe('Ticket Edit basic data path', () => {
const expectedMonth = tomorrow.getMonth() + 1;
const expectedYear = tomorrow.getFullYear();
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('28');
+ await page.loginAndModule('employee', 'ticket');
+ await page.accessToSearchResult('29');
await page.accessToSection('ticket.card.sale');
const item = await page.waitToGetProperty(selectors.ticketSales.firstSaleId, 'innerText');
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 14fe0c4eb..2576a9f57 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -1,200 +1,25 @@
{
- "Phone format is invalid": "El formato del teléfono no es correcto",
- "You are not allowed to change the credit": "No tienes privilegios para modificar el crédito",
- "Unable to mark the equivalence surcharge": "No se puede marcar el recargo de equivalencia",
- "The default consignee can not be unchecked": "No se puede desmarcar el consignatario predeterminado",
- "Unable to default a disabled consignee": "No se puede poner predeterminado un consignatario desactivado",
- "Can't be blank": "No puede estar en blanco",
- "Invalid TIN": "NIF/CIF invalido",
- "TIN must be unique": "El NIF/CIF debe ser único",
- "A client with that Web User name already exists": "Ya existe un cliente con ese Usuario Web",
- "Is invalid": "Is invalid",
- "Quantity cannot be zero": "La cantidad no puede ser cero",
- "Enter an integer different to zero": "Introduce un entero distinto de cero",
- "Package cannot be blank": "El embalaje no puede estar en blanco",
- "The company name must be unique": "La razón social debe ser única",
- "Invalid email": "Correo electrónico inválido",
- "The IBAN does not have the correct format": "El IBAN no tiene el formato correcto",
- "That payment method requires an IBAN": "El método de pago seleccionado requiere un IBAN",
- "That payment method requires a BIC": "El método de pago seleccionado requiere un BIC",
- "State cannot be blank": "El estado no puede estar en blanco",
- "Worker cannot be blank": "El trabajador no puede estar en blanco",
- "Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
- "can't be blank": "El campo no puede estar vacío",
- "Observation type must be unique": "El tipo de observación no puede repetirse",
+ "Name cannot be blank": "Name cannot be blank",
+ "Swift / BIC cannot be empty": "Swift / BIC cannot be empty",
+ "Street cannot be empty": "Street cannot be empty",
+ "City cannot be empty": "City cannot be empty",
+ "Invalid email": "Invalid email",
+ "Phone cannot be blank": "Phone cannot be blank",
"The credit must be an integer greater than or equal to zero": "The credit must be an integer greater than or equal to zero",
- "The grade must be similar to the last one": "El grade debe ser similar al último",
- "Only manager can change the credit": "Solo el gerente puede cambiar el credito de este cliente",
- "Name cannot be blank": "El nombre no puede estar en blanco",
- "Phone cannot be blank": "El teléfono no puede estar en blanco",
- "Period cannot be blank": "El periodo no puede estar en blanco",
- "Choose a company": "Selecciona una empresa",
- "Se debe rellenar el campo de texto": "Se debe rellenar el campo de texto",
- "Description should have maximum of 45 characters": "La descripción debe tener maximo 45 caracteres",
- "Cannot be blank": "El campo no puede estar en blanco",
- "The grade must be an integer greater than or equal to zero": "El grade debe ser un entero mayor o igual a cero",
- "Sample type cannot be blank": "El tipo de plantilla no puede quedar en blanco",
- "Description cannot be blank": "Se debe rellenar el campo de texto",
- "The new quantity should be smaller than the old one": "La nueva cantidad debe de ser menor que la anterior",
- "The value should not be greater than 100%": "El valor no debe de ser mayor de 100%",
- "The value should be a number": "El valor debe ser un numero",
- "This order is not editable": "Esta orden no se puede modificar",
- "You can't create an order for a frozen client": "No puedes crear una orden para un cliente congelado",
- "You can't create an order for a client that has a debt": "No puedes crear una orden para un cliente con deuda",
- "is not a valid date": "No es una fecha valida",
- "Barcode must be unique": "El código de barras debe ser único",
- "The warehouse can't be repeated": "El almacén no puede repetirse",
- "The tag can't be repeated": "El tag no puede repetirse",
- "The observation type can't be repeated": "El tipo de observación no puede repetirse",
- "A claim with that sale already exists": "Ya existe una reclamación para esta línea",
- "You don't have enough privileges to change that field": "No tienes permisos para cambiar ese campo",
- "Warehouse cannot be blank": "El almacén no puede quedar en blanco",
- "Agency cannot be blank": "La agencia no puede quedar en blanco",
- "You can't make changes on a client with verified data": "No puedes hacer cambios en un cliente con datos comprobados",
- "This address doesn't exist": "Este consignatario no existe",
- "You must delete the claim id %d first": "Antes debes borrar la reclamación %d",
- "You don't have enough privileges": "No tienes suficientes permisos",
- "Cannot check Equalization Tax in this NIF/CIF": "No se puede marcar RE en este NIF/CIF",
- "You can't make changes on the basic data of an confirmed order or with rows": "No puedes cambiar los datos basicos de una orden con artículos",
- "INVALID_USER_NAME": "El nombre de usuario solo debe contener letras minúsculas o, a partir del segundo carácter, números o subguiones, no esta permitido el uso de la letra ñ",
- "You can't create a ticket for a frozen client": "No puedes crear un ticket para un cliente congelado",
- "You can't create a ticket for a inactive client": "No puedes crear un ticket para un cliente inactivo",
- "Tag value cannot be blank": "El valor del tag no puede quedar en blanco",
- "ORDER_EMPTY": "Cesta vacía",
- "You don't have enough privileges to do that": "No tienes permisos para cambiar esto",
- "NO SE PUEDE DESACTIVAR EL CONSIGNAT": "NO SE PUEDE DESACTIVAR EL CONSIGNAT",
- "Error. El NIF/CIF está repetido": "Error. El NIF/CIF está repetido",
- "Street cannot be empty": "Dirección no puede estar en blanco",
- "City cannot be empty": "Cuidad no puede estar en blanco",
- "Code cannot be blank": "Código no puede estar en blanco",
- "You cannot remove this department": "No puedes eliminar este departamento",
- "The extension must be unique": "La extensión debe ser unica",
- "The secret can't be blank": "La contraseña no puede estar en blanco",
- "We weren't able to send this SMS": "No hemos podido enviar el SMS",
- "This client can't be invoiced": "Este cliente no puede ser facturado",
- "This ticket can't be invoiced": "Este ticket no puede ser facturado",
- "You cannot add or modify services to an invoiced ticket": "No puedes añadir o modificar servicios a un ticket facturado",
- "This ticket can not be modified": "Este ticket no puede ser modificado",
- "The introduced hour already exists": "Esta hora ya ha sido introducida",
- "INFINITE_LOOP": "Existe una dependencia entre dos Jefes",
- "The sales of the current ticket can't be modified": "Las lineas de este ticket no pueden ser modificadas",
- "The sales of the receiver ticket can't be modified": "Las lineas del ticket al que envias no pueden ser modificadas",
- "NO_AGENCY_AVAILABLE": "No hay una zona de reparto disponible con estos parámetros",
- "ERROR_PAST_SHIPMENT": "No puedes seleccionar una fecha de envío en pasado",
- "The current ticket can't be modified": "El ticket actual no puede ser modificado",
- "The current claim can't be modified": "La reclamación actual no puede ser modificada",
- "The sales of this ticket can't be modified": "Las lineas de este ticket no pueden ser modificadas",
- "Sale(s) blocked, contact production": "Linea(s) bloqueada(s), contacte con produccion",
- "Please select at least one sale": "Por favor selecciona al menos una linea",
- "All sales must belong to the same ticket": "Todas las lineas deben pertenecer al mismo ticket",
- "NO_ZONE_FOR_THIS_PARAMETERS": "Para este día no hay ninguna zona configurada",
- "This item doesn't exists": "El artículo no existe",
- "NOT_ZONE_WITH_THIS_PARAMETERS": "Para este día no hay ninguna zona configurada",
- "Extension format is invalid": "El formato de la extensión es inválido",
- "Invalid parameters to create a new ticket": "Parámetros inválidos para crear un nuevo ticket",
- "This item is not available": "Este artículo no está disponible",
- "This postcode already exists": "Este código postal ya existe",
- "Concept cannot be blank": "El concepto no puede quedar en blanco",
- "File doesn't exists": "El archivo no existe",
- "You don't have privileges to change the zone or for these parameters there are more than one shipping options, talk to agencies": "No tienes permisos para cambiar la zona o para esos parámetros hay más de una opción de envío, hable con las agencias",
- "This ticket is already on weekly tickets": "Este ticket ya está en tickets programados",
- "Ticket id cannot be blank": "El id de ticket no puede quedar en blanco",
- "Weekday cannot be blank": "El día de la semana no puede quedar en blanco",
- "You can't delete a confirmed order": "No puedes borrar un pedido confirmado",
- "Can't create stowaway for this ticket": "No se puede crear un polizon para este ticket",
- "The social name has an invalid format": "El nombre fiscal tiene un formato incorrecto",
- "Invalid quantity": "Cantidad invalida",
- "This postal code is not valid": "This postal code is not valid",
- "is invalid": "is invalid",
- "The postcode doesn't exist. Please enter a correct one": "El código postal no existe. Por favor, introduce uno correcto",
- "The department name can't be repeated": "El nombre del departamento no puede repetirse",
- "This phone already exists": "Este teléfono ya existe",
- "You cannot move a parent to its own sons": "No puedes mover un elemento padre a uno de sus hijos",
- "You can't create a claim for a removed ticket": "No puedes crear una reclamación para un ticket eliminado",
- "You cannot delete a ticket that part of it is being prepared": "No puedes eliminar un ticket en el que una parte que está siendo preparada",
- "You must delete all the buy requests first": "Debes eliminar todas las peticiones de compra primero",
- "You should specify a date": "Debes especificar una fecha",
- "You should specify at least a start or end date": "Debes especificar al menos una fecha de inicio o de fín",
- "Start date should be lower than end date": "La fecha de inicio debe ser menor que la fecha de fín",
- "You should mark at least one week day": "Debes marcar al menos un día de la semana",
- "Swift / BIC can't be empty": "Swift / BIC no puede estar vacío",
- "Customs agent is required for a non UEE member": "El agente de aduanas es requerido para los clientes extracomunitarios",
- "Incoterms is required for a non UEE member": "El incoterms es requerido para los clientes extracomunitarios",
- "Deleted sales from ticket": "He eliminado las siguientes lineas del ticket [{{ticketId}}]({{{ticketUrl}}}): {{{deletions}}}",
- "Added sale to ticket": "He añadido la siguiente linea al ticket [{{ticketId}}]({{{ticketUrl}}}): {{{addition}}}",
- "Changed sale discount": "He cambiado el descuento de las siguientes lineas al ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}",
- "Created claim": "He creado la reclamación [{{claimId}}]({{{claimUrl}}}) de las siguientes lineas del ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}",
- "Changed sale price": "He cambiado el precio de [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* del ticket [{{ticketId}}]({{{ticketUrl}}})",
- "Changed sale quantity": "He cambiado la cantidad de [{{itemId}} {{concept}}]({{{itemUrl}}}) de {{oldQuantity}} ➔ *{{newQuantity}}* del ticket [{{ticketId}}]({{{ticketUrl}}})",
- "State": "Estado",
- "regular": "normal",
- "reserved": "reservado",
- "Changed sale reserved state": "He cambiado el estado reservado de las siguientes lineas al ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}",
- "Bought units from buy request": "Se ha comprado {{quantity}} unidades de [{{itemId}} {{concept}}]({{{urlItem}}}) para el ticket id [{{ticketId}}]({{{url}}})",
- "Deny buy request": "Se ha rechazado la petición de compra para el ticket id [{{ticketId}}]({{{url}}}). Motivo: {{observation}}",
- "MESSAGE_INSURANCE_CHANGE": "He cambiado el crédito asegurado del cliente [{{clientName}} ({{clientId}})]({{{url}}}) a *{{credit}} €*",
- "Changed client paymethod": "He cambiado la forma de pago del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
- "Sent units from ticket": "Envio *{{quantity}}* unidades de [{{concept}} ({{itemId}})]({{{itemUrl}}}) a *\"{{nickname}}\"* provenientes del ticket id [{{ticketId}}]({{{ticketUrl}}})",
- "Claim will be picked": "Se recogerá el género de la reclamación [({{claimId}})]({{{claimUrl}}}) del cliente *{{clientName}}*",
- "Claim state has changed to incomplete": "Se ha cambiado el estado de la reclamación [({{claimId}})]({{{claimUrl}}}) del cliente *{{clientName}}* a *incompleta*",
- "This ticket is not an stowaway anymore": "El ticket id [{{ticketId}}]({{{ticketUrl}}}) ha dejado de ser un polizón",
- "Client checked as validated despite of duplication": "Cliente comprobado a pesar de que existe el cliente id {{clientId}}",
- "ORDER_ROW_UNAVAILABLE": "No hay disponibilidad de este producto",
- "Distance must be lesser than 1000": "La distancia debe ser inferior a 1000",
- "This ticket is deleted": "Este ticket está eliminado",
- "Unable to clone this travel": "No ha sido posible clonar este travel",
- "This thermograph id already exists": "La id del termógrafo ya existe",
- "Choose a date range or days forward": "Selecciona un rango de fechas o días en adelante",
- "ORDER_ALREADY_CONFIRMED": "ORDER_ALREADY_CONFIRMED",
- "Invalid password": "Invalid password",
- "Password does not meet requirements": "Password does not meet requirements",
- "Role already assigned": "Role already assigned",
- "Invalid role name": "Invalid role name",
- "Role name must be written in camelCase": "Role name must be written in camelCase",
- "Email already exists": "Email already exists",
- "User already exists": "User already exists",
- "Absence change notification on the labour calendar": "Notificacion de cambio de ausencia en el calendario laboral",
- "Created absence": "El empleado {{author}} ha añadido una ausencia de tipo '{{absenceType}}' a {{employee}} para el día {{dated}}.",
- "Deleted absence": "El empleado {{author}} ha eliminado una ausencia de tipo '{{absenceType}}' a {{employee}} del día {{dated}}.",
- "I have deleted the ticket id": "He eliminado el ticket id [{{id}}]({{{url}}})",
- "I have restored the ticket id": "He restaurado el ticket id [{{id}}]({{{url}}})",
- "You can only restore a ticket within the first hour after deletion": "Únicamente puedes restaurar el ticket dentro de la primera hora después de su eliminación",
- "Changed this data from the ticket": "He cambiado estos datos del ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}",
- "agencyModeFk": "Agencia",
- "clientFk": "Cliente",
- "zoneFk": "Zona",
- "warehouseFk": "Almacén",
- "shipped": "F. envío",
- "landed": "F. entrega",
- "addressFk": "Consignatario",
- "companyFk": "Empresa",
- "The social name cannot be empty": "La razón social no puede quedar en blanco",
- "The nif cannot be empty": "El NIF no puede quedar en blanco",
- "You need to fill sage information before you check verified data": "Debes rellenar la información de sage antes de marcar datos comprobados",
- "ASSIGN_ZONE_FIRST": "Asigna una zona primero",
- "Amount cannot be zero": "El importe no puede ser cero",
- "Company has to be official": "Empresa inválida",
- "You can not select this payment method without a registered bankery account": "No se puede utilizar este método de pago si no has registrado una cuenta bancaria",
- "Action not allowed on the test environment": "Esta acción no está permitida en el entorno de pruebas",
- "The selected ticket is not suitable for this route": "El ticket seleccionado no es apto para esta ruta",
- "Sorts whole route": "Reordena ruta entera",
- "New ticket request has been created with price": "Se ha creado una nueva petición de compra '{{description}}' para el día *{{shipped}}*, con una cantidad de *{{quantity}}* y un precio de *{{price}} €*",
- "New ticket request has been created": "Se ha creado una nueva petición de compra '{{description}}' para el día *{{shipped}}*, con una cantidad de *{{quantity}}*",
- "Swift / BIC cannot be empty": "Swift / BIC no puede estar vacío",
- "This BIC already exist.": "Este BIC ya existe.",
- "That item doesn't exists": "Ese artículo no existe",
- "There's a new urgent ticket:": "Hay un nuevo ticket urgente:",
- "Invalid account": "Cuenta inválida",
- "Compensation account is empty": "La cuenta para compensar está vacia",
- "This genus already exist": "Este genus ya existe",
- "This specie already exist": "Esta especie ya existe",
- "Client assignment has changed": "He cambiado el comercial ~*\"<{{previousWorkerName}}>\"*~ por *\"<{{currentWorkerName}}>\"* del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
- "None": "Ninguno",
- "The contract was not active during the selected date": "El contrato no estaba activo durante la fecha seleccionada",
- "Cannot add more than one '1/2 day vacation'": "No puedes añadir más de un 'Vacaciones 1/2 dia'",
- "This document already exists on this ticket": "Este documento ya existe en el ticket",
- "Some of the selected tickets are not billable": "Algunos de los tickets seleccionados no son facturables",
- "You can't invoice tickets from multiple clients": "No puedes facturar tickets de multiples clientes",
+ "The grade must be an integer greater than or equal to zero": "The grade must be an integer greater than or equal to zero",
+ "Description should have maximum of 45 characters": "Description should have maximum of 45 characters",
+ "Amount cannot be zero": "Amount cannot be zero",
+ "Period cannot be blank": "Period cannot be blank",
+ "Sample type cannot be blank": "Sample type cannot be blank",
+ "Cannot be blank": "Cannot be blank",
+ "The social name cannot be empty": "The social name cannot be empty",
+ "The nif cannot be empty": "The nif cannot be empty",
+ "Concept cannot be blank": "Concept cannot be blank",
+ "Enter an integer different to zero": "Enter an integer different to zero",
+ "Package cannot be blank": "Package cannot be blank",
+ "State cannot be blank": "State cannot be blank",
+ "Worker cannot be blank": "Worker cannot be blank",
+ "Agency cannot be blank": "Agency cannot be blank",
"nickname": "nickname",
"INACTIVE_PROVIDER": "Proveedor inactivo",
"This client is not invoiceable": "Este cliente no es facturable",
@@ -219,5 +44,8 @@
"isWithoutNegatives": "Tiene Negativos",
"You can not modify is pay method checked": "No se puede modificar el campo método de pago validado",
"Can't transfer claimed sales": "No puedes transferir lineas reclamadas",
- "You don't have privileges to create pay back": "No tienes permisos para crear un abono"
+ "You don't have privileges to create pay back": "No tienes permisos para crear un abono",
+ "shipped": "shipped",
+ "landed": "landed",
+ "Changed this data from the ticket": "Changed this data from the ticket"
}
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/componentUpdate.js b/modules/ticket/back/methods/ticket/componentUpdate.js
index 2575bfdbe..64b02e2f2 100644
--- a/modules/ticket/back/methods/ticket/componentUpdate.js
+++ b/modules/ticket/back/methods/ticket/componentUpdate.js
@@ -132,17 +132,13 @@ module.exports = Self => {
throw new UserError(error);
}
}
+
if (args.isWithoutNegatives) {
- const query = `CALL ticket_getVisibleAvailable(?,?)`;
- const params = [args.id, args.shipped];
- const [salesAvailable] = await Self.rawSql(query, params, myOptions);
-
- let salesNewTicket = [];
- salesAvailable.forEach(sale => {
- if (sale.available >= sale.quantity)
- salesNewTicket.push(sale);
- });
+ const query = `CALL ticket_getAdvanceable(?,?,?)`;
+ const params = [args.id, args.shipped, args.warehouseFk];
+ const [salesAdvanceable] = await Self.rawSql(query, params, myOptions);
+ const salesNewTicket = salesAdvanceable.filter(sale => (sale.advanceable ?? 0) >= sale.quantity);
if (salesNewTicket.length) {
const newTicket = await models.Ticket.transferSales(ctx, args.id, null, salesNewTicket, myOptions);
args.id = newTicket.id;
diff --git a/modules/ticket/back/methods/ticket/priceDifference.js b/modules/ticket/back/methods/ticket/priceDifference.js
index 9bcea8e7c..e6688da96 100644
--- a/modules/ticket/back/methods/ticket/priceDifference.js
+++ b/modules/ticket/back/methods/ticket/priceDifference.js
@@ -110,19 +110,14 @@ module.exports = Self => {
totalDifference: 0.00,
};
- // Get items available
- let query = `CALL ticket_getVisibleAvailable(?,?)`;
- let params = [args.id, args.shipped];
- const [salesAvailable] = await Self.rawSql(query, params, myOptions);
+ // Get items advanceable
+ let query = `CALL ticket_getAdvanceable(?,?,?)`;
+ let params = [args.id, args.shipped, args.warehouseId];
+ const [salesAdvanceable] = await Self.rawSql(query, params, myOptions);
- const itemAvailable = new Map();
- for (sale of salesAvailable) {
- let available = sale.available;
- if (available == null)
- available = 0;
-
- itemAvailable.set(sale.id, available);
- }
+ const itemAdvanceable = new Map();
+ for (sale of salesAdvanceable)
+ itemAdvanceable.set(sale.id, sale.advanceable ?? 0);
// Sale price component, one per sale
query = `CALL vn.ticket_priceDifference(?, ?, ?, ?, ?)`;
@@ -147,7 +142,7 @@ module.exports = Self => {
salesObj.totalUnitPrice += sale.price;
salesObj.totalUnitPrice = round(salesObj.totalUnitPrice);
- sale.available = itemAvailable.get(sale.id);
+ sale.advanceable = itemAdvanceable.get(sale.id);
}
if (tx) await tx.commit();
diff --git a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
index 38e6ce6a7..2aa2a07c4 100644
--- a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js
@@ -136,4 +136,60 @@ describe('ticket componentUpdate()', () => {
throw e;
}
});
+
+ it('should change warehouse and without negatives', async() => {
+ const tx = await models.SaleComponent.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const saleToTransfer = 27;
+ const originDate = today;
+ const newDate = tomorrow;
+ const ticketID = 14;
+ newDate.setHours(0, 0, 0, 0, 0);
+ originDate.setHours(0, 0, 0, 0, 0);
+
+ const args = {
+ id: ticketID,
+ clientFk: 1104,
+ agencyModeFk: 2,
+ addressFk: 4,
+ zoneFk: 9,
+ warehouseFk: 1,
+ companyFk: 442,
+ shipped: newDate,
+ landed: tomorrow,
+ isDeleted: false,
+ option: 1,
+ isWithoutNegatives: true
+ };
+
+ const ctx = {
+ args: args,
+ req: {
+ accessToken: {userId: 9},
+ headers: {origin: 'http://localhost'},
+ __: value => {
+ return value;
+ }
+ }
+ };
+ await models.Ticket.componentUpdate(ctx, options);
+
+ const [newTicketID] = await models.Ticket.rawSql('SELECT MAX(id) as id FROM ticket', null, options);
+ const oldTicket = await models.Ticket.findById(ticketID, null, options);
+ const newTicket = await models.Ticket.findById(newTicketID.id, null, options);
+ const newTicketSale = await models.Sale.findOne({where: {ticketFk: args.id}}, options);
+
+ expect(oldTicket.shipped).toEqual(originDate);
+ expect(newTicket.shipped).toEqual(newDate);
+ expect(newTicketSale.id).toEqual(saleToTransfer);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
});
diff --git a/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js b/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
index 8fe906bcf..362c3e923 100644
--- a/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/priceDifference.spec.js
@@ -60,7 +60,7 @@ describe('sale priceDifference()', () => {
expect(error).toEqual(new UserError(`The sales of this ticket can't be modified`));
});
- it('should return ticket available', async() => {
+ it('should return ticket advanceable', async() => {
const tx = await models.Ticket.beginTransaction({});
try {
@@ -83,8 +83,8 @@ describe('sale priceDifference()', () => {
const firstItem = result.items[0];
const secondtItem = result.items[1];
- expect(firstItem.available).toEqual(410);
- expect(secondtItem.available).toEqual(1870);
+ expect(firstItem.advanceable).toEqual(440);
+ expect(secondtItem.advanceable).toEqual(1980);
await tx.rollback();
} catch (e) {
diff --git a/modules/ticket/front/basic-data/step-two/index.html b/modules/ticket/front/basic-data/step-two/index.html
index 74b160fda..298725189 100644
--- a/modules/ticket/front/basic-data/step-two/index.html
+++ b/modules/ticket/front/basic-data/step-two/index.html
@@ -9,7 +9,7 @@
Item
Description
- Available
+ Advanceable
Quantity
Price (PPU)
New (PPU)
@@ -35,8 +35,8 @@
- {{::sale.available}}
+ ng-class="{'alert': sale.quantity>sale.advanceable}">
+ {{::sale.advanceable}}
{{::sale.quantity}}
diff --git a/modules/ticket/front/basic-data/step-two/index.js b/modules/ticket/front/basic-data/step-two/index.js
index d77090781..db0bb6d44 100644
--- a/modules/ticket/front/basic-data/step-two/index.js
+++ b/modules/ticket/front/basic-data/step-two/index.js
@@ -69,7 +69,7 @@ class Controller extends Component {
let haveNotNegatives = false;
this.ticket.sale.items.forEach(item => {
- if (item.quantity > item.available)
+ if (item.quantity > item.advanceable)
haveNegatives = true;
else
haveNotNegatives = true;
diff --git a/modules/ticket/front/basic-data/step-two/index.spec.js b/modules/ticket/front/basic-data/step-two/index.spec.js
index fcd1d7e49..0567785e9 100644
--- a/modules/ticket/front/basic-data/step-two/index.spec.js
+++ b/modules/ticket/front/basic-data/step-two/index.spec.js
@@ -73,12 +73,12 @@ describe('Ticket', () => {
{
item: 1,
quantity: 2,
- available: 1
+ advanceable: 1
},
{
item: 2,
quantity: 1,
- available: 5
+ advanceable: 5
}
]
}
diff --git a/modules/ticket/front/basic-data/step-two/locale/es.yml b/modules/ticket/front/basic-data/step-two/locale/es.yml
index 08bef3b09..ccf1f5572 100644
--- a/modules/ticket/front/basic-data/step-two/locale/es.yml
+++ b/modules/ticket/front/basic-data/step-two/locale/es.yml
@@ -7,4 +7,5 @@ Price: Precio
New price: Nuevo precio
Price difference: Diferencia de precio
Without create negatives: Sin crear negativos
-Clone this ticket with the changes and only sales availables: Clona este ticket con los cambios y solo las ventas disponibles.
\ No newline at end of file
+Clone this ticket with the changes and only sales availables: Clona este ticket con los cambios y solo las ventas disponibles.
+Advanceable: Avanzable
\ No newline at end of file