diff --git a/db/changes/10451-april/00-ticket_doRefund.sql b/db/changes/10451-april/00-ticket_doRefund.sql
index 5540ff8cfc..1621cc5901 100644
--- a/db/changes/10451-april/00-ticket_doRefund.sql
+++ b/db/changes/10451-april/00-ticket_doRefund.sql
@@ -2,49 +2,63 @@ DROP PROCEDURE IF EXISTS vn.ticket_doRefund;
DELIMITER $$
$$
-CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_doRefund`(IN vOriginTicket INT, OUT vNewTicket INT)
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_doRefund`(OUT vNewTicket INT)
BEGIN
-
+/**
+ * Crea un ticket de abono a partir de tmp.sale y/o tmp.ticketService
+ *
+ * @return vNewTicket
+ */
DECLARE vDone BIT DEFAULT 0;
- DECLARE vCustomer MEDIUMINT;
+ DECLARE vClientFk MEDIUMINT;
DECLARE vWarehouse TINYINT;
DECLARE vCompany MEDIUMINT;
DECLARE vAddress MEDIUMINT;
- DECLARE vRefundAgencyMode INT;
- DECLARE vItemFk INT;
- DECLARE vQuantity DECIMAL (10,2);
- DECLARE vConcept VARCHAR(50);
- DECLARE vPrice DECIMAL (10,2);
- DECLARE vDiscount TINYINT;
+ DECLARE vRefundAgencyMode INT;
+ DECLARE vItemFk INT;
+ DECLARE vQuantity DECIMAL (10,2);
+ DECLARE vConcept VARCHAR(50);
+ DECLARE vPrice DECIMAL (10,2);
+ DECLARE vDiscount TINYINT;
DECLARE vSaleNew INT;
- DECLARE vSaleMain INT;
- DECLARE vZoneFk INT;
- DECLARE vDescription VARCHAR(50);
- DECLARE vTaxClassFk INT;
- DECLARE vTicketServiceTypeFk INT;
-
- DECLARE cSales CURSOR FOR
- SELECT *
- FROM tmp.sale;
-
+ DECLARE vSaleMain INT;
+ DECLARE vZoneFk INT;
+ DECLARE vDescription VARCHAR(50);
+ DECLARE vTaxClassFk INT;
+ DECLARE vTicketServiceTypeFk INT;
+ DECLARE vOriginTicket INT;
+
+ DECLARE cSales CURSOR FOR
+ SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount
+ FROM tmp.sale s;
+
DECLARE cTicketServices CURSOR FOR
- SELECT *
- FROM tmp.ticketService;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = 1;
-
- SELECT id INTO vRefundAgencyMode
+ SELECT ts.description, - ts.quantity, ts.price, ts.taxClassFk, ts.ticketServiceTypeFk
+ FROM tmp.ticketService ts;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+ SELECT sub.ticketFk INTO vOriginTicket
+ FROM (
+ SELECT s.ticketFk
+ FROM tmp.sale s
+ UNION ALL
+ SELECT ts.ticketFk
+ FROM tmp.ticketService ts
+ ) sub;
+
+ SELECT id INTO vRefundAgencyMode
FROM agencyMode WHERE `name` = 'ABONO';
SELECT clientFk, warehouseFk, companyFk, addressFk
- INTO vCustomer, vWarehouse, vCompany, vAddress
- FROM ticket
- WHERE id = vOriginTicket;
-
- SELECT id INTO vZoneFk
+ INTO vClientFk, vWarehouse, vCompany, vAddress
+ FROM ticket
+ WHERE id = vOriginTicket;
+
+ SELECT id INTO vZoneFk
FROM zone WHERE agencyModeFk = vRefundAgencyMode
- LIMIT 1;
-
+ LIMIT 1;
+
INSERT INTO vn.ticket (
clientFk,
shipped,
@@ -54,10 +68,10 @@ BEGIN
warehouseFk,
companyFk,
landed,
- zoneFk
+ zoneFk
)
SELECT
- vCustomer,
+ vClientFk,
CURDATE(),
vAddress,
vRefundAgencyMode,
@@ -65,49 +79,48 @@ BEGIN
vWarehouse,
vCompany,
CURDATE(),
- vZoneFk
+ vZoneFk
FROM address a
WHERE a.id = vAddress;
SET vNewTicket = LAST_INSERT_ID();
- SET vDone := 0;
+ SET vDone := FALSE;
OPEN cSales;
- FETCH cSales INTO vSaleMain, vItemFk, vQuantity, vConcept, vPrice, vDiscount;
+ FETCH cSales INTO vSaleMain, vItemFk, vQuantity, vConcept, vPrice, vDiscount;
WHILE NOT vDone DO
-
+
INSERT INTO vn.sale(ticketFk, itemFk, quantity, concept, price, discount)
VALUES( vNewTicket, vItemFk, vQuantity, vConcept, vPrice, vDiscount );
-
- SET vSaleNew = LAST_INSERT_ID();
-
- INSERT INTO vn.saleComponent(saleFk,componentFk,`value`)
- SELECT vSaleNew,componentFk,`value`
- FROM vn.saleComponent
- WHERE saleFk = vSaleMain;
-
+
+ SET vSaleNew = LAST_INSERT_ID();
+
+ INSERT INTO vn.saleComponent(saleFk,componentFk,`value`)
+ SELECT vSaleNew,componentFk,`value`
+ FROM vn.saleComponent
+ WHERE saleFk = vSaleMain;
+
FETCH cSales INTO vSaleMain, vItemFk, vQuantity, vConcept, vPrice, vDiscount;
-
+
END WHILE;
CLOSE cSales;
- SET vDone := 0;
+ SET vDone := FALSE;
OPEN cTicketServices;
- FETCH cTicketServices INTO vDescription, vQuantity, vPrice, vTaxClassFk, vTicketServiceTypeFk;
+ FETCH cTicketServices INTO vDescription, vQuantity, vPrice, vTaxClassFk, vTicketServiceTypeFk;
WHILE NOT vDone DO
-
+
INSERT INTO vn.ticketService(description, quantity, price, taxClassFk, ticketFk, ticketServiceTypeFk)
VALUES(vDescription, vQuantity, vPrice, vTaxClassFk, vNewTicket, vTicketServiceTypeFk);
-
+
FETCH cTicketServices INTO vDescription, vQuantity, vPrice, vTaxClassFk, vTicketServiceTypeFk;
-
+
END WHILE;
CLOSE cTicketServices;
INSERT INTO vn.ticketRefund(refundTicketFk, originalTicketFk)
VALUES(vNewTicket, vOriginTicket);
-
END$$
DELIMITER ;
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index 859486ab17..8ce799c1af 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -76,6 +76,13 @@
translate>
Show CITES letter
+
+ Refund
+
+
+
diff --git a/modules/invoiceOut/front/descriptor-menu/locale/es.yml b/modules/invoiceOut/front/descriptor-menu/locale/es.yml
index a76f6aad30..8949f1f91b 100644
--- a/modules/invoiceOut/front/descriptor-menu/locale/es.yml
+++ b/modules/invoiceOut/front/descriptor-menu/locale/es.yml
@@ -12,6 +12,8 @@ Are you sure you want to delete this invoice?: Estas seguro de eliminar esta fac
Are you sure you want to clone this invoice?: Estas seguro de clonar esta factura?
InvoiceOut booked: Factura asentada
Are you sure you want to book this invoice?: Estas seguro de querer asentar esta factura?
+Are you sure you want to refund this invoice?: Estas seguro de querer abonar esta factura?
+Create a single ticket with all the content of the current invoice: Crear un ticket unico con todo el contenido de la factura actual
Regenerate PDF invoice: Regenerar PDF factura
The invoice PDF document has been regenerated: El documento PDF de la factura ha sido regenerado
The email can't be empty: El correo no puede estar vacĂo
diff --git a/modules/ticket/back/methods/sale/refundAll.js b/modules/ticket/back/methods/sale/refundAll.js
index 6fcd27f0a6..ac8e1664a2 100644
--- a/modules/ticket/back/methods/sale/refundAll.js
+++ b/modules/ticket/back/methods/sale/refundAll.js
@@ -2,13 +2,19 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('refundAll', {
- description: 'Create ticket with all lines and services changing the sign to the quantites',
+ description: 'Create ticket refund with all lines and services changing the sign to the quantites',
accessType: 'WRITE',
accepts: [{
- arg: 'ticketId',
- type: 'number',
+ arg: 'sales',
+ description: 'The sales',
+ type: ['object'],
+ required: true
+ },
+ {
+ arg: 'services',
+ type: ['object'],
required: true,
- description: 'The ticket id'
+ description: 'The services'
}],
returns: {
type: 'number',
@@ -20,7 +26,7 @@ module.exports = Self => {
}
});
- Self.refundAll = async(ctx, ticketId, options) => {
+ Self.refundAll = async(ctx, sales, services, options) => {
const myOptions = {};
let tx;
@@ -49,27 +55,26 @@ module.exports = Self => {
CREATE TEMPORARY TABLE tmp.sale
SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount
FROM sale s
- JOIN ticket t ON t.id = s.ticketFk
- WHERE t.id IN (?);
+ WHERE s.id IN (?);
CREATE TEMPORARY TABLE tmp.ticketService
SELECT ts.description, - ts.quantity, ts.price, ts.taxClassFk, ts.ticketServiceTypeFk
FROM ticketService ts
- WHERE ts.ticketFk IN (?);
+ WHERE ts.id IN (?);
- CALL vn.ticket_doRefund(?, @newTicket);
+ CALL vn.ticket_doRefund(@newTicket);
DROP TEMPORARY TABLE tmp.sale;
DROP TEMPORARY TABLE tmp.ticketService;`;
- await Self.rawSql(query, [ticketId, ticketId, ticketId], myOptions);
+ await Self.rawSql(query, [sales, services], myOptions);
const [newTicket] = await Self.rawSql('SELECT @newTicket id', null, myOptions);
- ticketId = newTicket.id;
+ const newTicketId = newTicket.id;
if (tx) await tx.commit();
- return ticketId;
+ return newTicketId;
} catch (e) {
if (tx) await tx.rollback();
throw e;