diff --git a/db/changes/233201/00-transferInvoiceOutACL.sql b/db/changes/233201/00-transferInvoiceOutACL.sql
index b549e52a84..6e8d88c5d9 100644
--- a/db/changes/233201/00-transferInvoiceOutACL.sql
+++ b/db/changes/233201/00-transferInvoiceOutACL.sql
@@ -1,6 +1,6 @@
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
VALUES
('CplusRectificationType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
- ('CplusCorrectingType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
+ ('CplusInvoiceType477', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
('InvoiceCorrectionType', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
('InvoiceOut', 'transferInvoiceOut', 'WRITE', 'ALLOW', 'ROLE', 'employee');
\ No newline at end of file
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
index b50e4b1a79..d53581ac62 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoiceOut.js
@@ -34,15 +34,17 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const {ref, newClientFk, cplusRectificationId, cplusCorrectingTypeId, invoiceCorrectionTypeId} = params;
- if (!ref || !newClientFk || !cplusRectificationId || !cplusCorrectingTypeId || !invoiceCorrectionTypeId)
+ const {id, ref, newClientFk, cplusRectificationId, cplusInvoiceType477FkId, invoiceCorrectionTypeId} = params;
+ if (!id || !ref || !newClientFk || !cplusRectificationId || !cplusInvoiceType477FkId || !invoiceCorrectionTypeId)
throw new UserError(`There are missing fields.`);
+ // Refund tickets and group
const filter = {where: {refFk: ref}};
const tickets = await models.Ticket.find(filter, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
- const refundTicket = await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
- // Clonar tickets
+ await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
+
+ // Clone tickets
const refundAgencyMode = await models.AgencyMode.findOne({
include: {
relation: 'zones',
@@ -66,11 +68,28 @@ module.exports = Self => {
}
};
const sales = await models.Sale.find(salesFilter, myOptions);
- // Actualizar cliente
+ const isRefund = false;
+ const clonedTicketIds = await models.Sale.clone(sales, refundAgencyMode, refoundZoneId, servicesIds, null, isRefund, myOptions);
- // Invoice Ticket - Factura rĂ¡pida ??
+ // Update client
+ for (const clonedTicketId of clonedTicketIds) {
+ const ticket = await models.Ticket.findById(clonedTicketId, myOptions);
+ await ticket.updateAttributes({clientFk: newClientFk});
+ }
+ // Quick invoice
+ const invoiceIds = await models.Ticket.invoiceTickets(ctx, clonedTicketIds, myOptions);
// Insert InvoiceCorrection
+ for (const invoiceId of invoiceIds) {
+ await models.invoiceCorrection.create({
+ correctingFk: invoiceId,
+ correctedFk: id,
+ cplusRectificationTypeFk: cplusRectificationId,
+ cplusInvoiceType477Fk: cplusInvoiceType477FkId,
+ invoiceCorrectionType: invoiceCorrectionTypeId
+ });
+ }
+
if (tx) await tx.commit();
} catch (e) {
if (tx) await tx.rollback();
diff --git a/modules/invoiceOut/back/model-config.json b/modules/invoiceOut/back/model-config.json
index 995ea976ba..23246893b4 100644
--- a/modules/invoiceOut/back/model-config.json
+++ b/modules/invoiceOut/back/model-config.json
@@ -35,13 +35,13 @@
"CplusRectificationType": {
"dataSource": "vn"
},
- "CplusCorrectingType": {
- "dataSource": "vn"
- },
"InvoiceCorrectionType": {
"dataSource": "vn"
},
"InvoiceCorrection": {
"dataSource": "vn"
+ },
+ "CplusInvoiceType477": {
+ "dataSource": "vn"
}
}
diff --git a/modules/invoiceOut/back/models/cplus-correcting-type.json b/modules/invoiceOut/back/models/cplus-invoice-type-477.json
similarity index 78%
rename from modules/invoiceOut/back/models/cplus-correcting-type.json
rename to modules/invoiceOut/back/models/cplus-invoice-type-477.json
index 660f600082..840a9a7e4e 100644
--- a/modules/invoiceOut/back/models/cplus-correcting-type.json
+++ b/modules/invoiceOut/back/models/cplus-invoice-type-477.json
@@ -1,9 +1,9 @@
{
- "name": "CplusCorrectingType",
+ "name": "CplusInvoiceType477",
"base": "VnModel",
"options": {
"mysql": {
- "table": "cplusCorrectingType"
+ "table": "cplusInvoiceType477"
}
},
"properties": {
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index d6eaa1cc76..1655290f44 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -6,8 +6,8 @@
+ url="CplusInvoiceType477s"
+ data="cplusInvoiceType477">
sale.ticketFk))];
- const [firstTicketId] = ticketsIds;
+module.exports = Self => {
+ Self.clone = async(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, isRefund, myOptions) => {
+ const models = Self.app.models;
+ const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
- const now = Date.vnNew();
- let refundTickets = [];
- let refundTicket;
+ const now = Date.vnNew();
+ let updatedTickets = [];
- if (!group) {
for (const ticketId of ticketsIds) {
- refundTicket = await createTicketRefund(
- ticketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- null,
- myOptions
- );
- refundTickets.push(refundTicket);
- }
- } else {
- refundTicket = await createTicketRefund(
- firstTicketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- withWarehouse,
- myOptions
- );
- }
+ const filter = {include: {relation: 'address'}};
+ const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
- for (const sale of sales) {
- const createdSale = await models.Sale.create({
- ticketFk: (group) ? refundTicket.id : sale.ticketFk,
- itemFk: sale.itemFk,
- quantity: (isRefund) ? - sale.quantity : sale.quantity,
- concept: sale.concept,
- price: sale.price,
- discount: sale.discount,
- }, myOptions);
-
- const components = sale.components();
- for (const component of components)
- component.saleFk = createdSale.id;
-
- await models.SaleComponent.create(components, myOptions);
- }
-
- if (servicesIds && servicesIds.length > 0) {
- const servicesFilter = {
- where: {id: {inq: servicesIds}}
- };
- const services = await models.TicketService.find(servicesFilter, myOptions);
- for (const service of services) {
- await models.TicketService.create({
- description: service.description,
- quantity: (isRefund) ? - service.quantity : service.quantity,
- price: service.price,
- taxClassFk: service.taxClassFk,
- ticketFk: (group) ? refundTicket.id : service.ticketFk,
- ticketServiceTypeFk: service.ticketServiceTypeFk,
+ const ticketUpdated = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
}, myOptions);
+ updatedTickets.push(ticketUpdated);
}
- }
- const query = `CALL vn.ticket_recalc(?, NULL)`;
- if (refundTickets.length > 0) {
- for (const refundTicket of refundTickets)
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTickets.map(refundTicket => refundTicket.id);
- } else {
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTicket;
- }
+ for (const sale of sales) {
+ const createdSale = await models.Sale.create({
+ ticketFk: sale.ticketFk,
+ itemFk: sale.itemFk,
+ quantity: (isRefund) ? - sale.quantity : sale.quantity,
+ concept: sale.concept,
+ price: sale.price,
+ discount: sale.discount,
+ }, myOptions);
+
+ const components = sale.components();
+ for (const component of components)
+ component.saleFk = createdSale.id;
+
+ await models.SaleComponent.create(components, myOptions);
+ }
+
+ if (servicesIds && servicesIds.length > 0) {
+ const servicesFilter = {
+ where: {id: {inq: servicesIds}}
+ };
+ const services = await models.TicketService.find(servicesFilter, myOptions);
+ for (const service of services) {
+ await models.TicketService.create({
+ description: service.description,
+ quantity: (isRefund) ? - service.quantity : service.quantity,
+ price: service.price,
+ taxClassFk: service.taxClassFk,
+ ticketFk: service.ticketFk,
+ ticketServiceTypeFk: service.ticketServiceTypeFk,
+ }, myOptions);
+ }
+ }
+
+ const query = `CALL vn.ticket_recalc(?, NULL)`;
+
+ for (const updatedTicket of updatedTickets)
+ await Self.rawSql(query, [updatedTicket.id], myOptions);
+ return updatedTickets.map(updatedTicket => updatedTicket.id);
+ };
};
diff --git a/modules/ticket/back/methods/sale/createTicketRefund.js b/modules/ticket/back/methods/sale/createTicketRefund.js
deleted file mode 100644
index 0ecc62e0c6..0000000000
--- a/modules/ticket/back/methods/sale/createTicketRefund.js
+++ /dev/null
@@ -1,25 +0,0 @@
-module.exports = async function createTicketRefund(models, ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
- // const models = Self.app.models;
-
- const filter = {include: {relation: 'address'}};
- const ticket = await models.Ticket.findById(ticketId, filter, myOptions);
-
- const refundTicket = await models.Ticket.create({
- clientFk: ticket.clientFk,
- shipped: now,
- addressFk: ticket.address().id,
- agencyModeFk: refundAgencyMode.id,
- nickname: ticket.address().nickname,
- warehouseFk: withWarehouse ? ticket.warehouseFk : null,
- companyFk: ticket.companyFk,
- landed: now,
- zoneFk: refoundZoneId
- }, myOptions);
-
- await models.TicketRefund.create({
- refundTicketFk: refundTicket.id,
- originalTicketFk: ticket.id,
- }, myOptions);
-
- return refundTicket;
-};
diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js
index fc6d8bbc2b..6bb131e4d3 100644
--- a/modules/ticket/back/methods/sale/refund.js
+++ b/modules/ticket/back/methods/sale/refund.js
@@ -158,10 +158,11 @@ module.exports = Self => {
const group = true;
const isRefund = true;
- const refundTicket = await clone(
+ const refundTicket = await cloneAndGroup(
sales,
refundAgencyMode,
- refoundZoneId, servicesIds,
+ refoundZoneId,
+ servicesIds,
withWarehouse,
group,
isRefund,
@@ -176,41 +177,37 @@ module.exports = Self => {
}
};
- async function clone(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
- const models = Self.app.models;
+ async function cloneAndGroup(sales, refundAgencyMode, refoundZoneId, servicesIds, withWarehouse, group, isRefund, myOptions) {
+ if (!group) {
+ const tickets = await models.Sale.clone(sales,
+ refundAgencyMode,
+ refoundZoneId, servicesIds,
+ withWarehouse,
+ isRefund,
+ myOptions);
+ return tickets;
+ }
+
const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))];
const [firstTicketId] = ticketsIds;
+ const filter = {include: {relation: 'address'}};
+ const ticket = await models.Ticket.findById(firstTicketId, filter, myOptions);
- const now = Date.vnNew();
- let refundTickets = [];
- let refundTicket;
-
- if (!group) {
- for (const ticketId of ticketsIds) {
- refundTicket = await createTicketRefund(
- ticketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- null,
- myOptions
- );
- refundTickets.push(refundTicket);
- }
- } else {
- refundTicket = await createTicketRefund(
- firstTicketId,
- now,
- refundAgencyMode,
- refoundZoneId,
- withWarehouse,
- myOptions
- );
- }
+ const ticketUpdated = await models.Ticket.create({
+ clientFk: ticket.clientFk,
+ shipped: now,
+ addressFk: ticket.address().id,
+ agencyModeFk: refundAgencyMode.id,
+ nickname: ticket.address().nickname,
+ warehouseFk: withWarehouse ? ticket.warehouseFk : null,
+ companyFk: ticket.companyFk,
+ landed: now,
+ zoneFk: refoundZoneId
+ }, myOptions);
for (const sale of sales) {
const createdSale = await models.Sale.create({
- ticketFk: (group) ? refundTicket.id : sale.ticketFk,
+ ticketFk: ticketUpdated.id,
itemFk: sale.itemFk,
quantity: (isRefund) ? - sale.quantity : sale.quantity,
concept: sale.concept,
@@ -236,21 +233,15 @@ module.exports = Self => {
quantity: (isRefund) ? - service.quantity : service.quantity,
price: service.price,
taxClassFk: service.taxClassFk,
- ticketFk: (group) ? refundTicket.id : service.ticketFk,
+ ticketFk: ticketUpdated.id,
ticketServiceTypeFk: service.ticketServiceTypeFk,
}, myOptions);
}
}
const query = `CALL vn.ticket_recalc(?, NULL)`;
- if (refundTickets.length > 0) {
- for (const refundTicket of refundTickets)
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTickets.map(refundTicket => refundTicket.id);
- } else {
- await Self.rawSql(query, [refundTicket.id], myOptions);
- return refundTicket;
- }
+ await Self.rawSql(query, [refundTicket.id], myOptions);
+ return ticketUpdated;
}
async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) {
diff --git a/modules/ticket/back/models/sale.js b/modules/ticket/back/models/sale.js
index bab201fddb..e65c98feae 100644
--- a/modules/ticket/back/models/sale.js
+++ b/modules/ticket/back/models/sale.js
@@ -10,6 +10,7 @@ module.exports = Self => {
require('../methods/sale/refund')(Self);
require('../methods/sale/canEdit')(Self);
require('../methods/sale/usesMana')(Self);
+ require('../methods/sale/clone')(Self);
Self.validatesPresenceOf('concept', {
message: `Concept cannot be blank`