Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 4091-dms_clean

This commit is contained in:
Vicent Llopis 2022-07-22 13:41:02 +02:00
commit fc6e51e91f
27 changed files with 157 additions and 109 deletions

View File

@ -37102,6 +37102,7 @@ CREATE TABLE `ticket` (
`zoneBonus` decimal(10,2) DEFAULT NULL,
`totalWithVat` decimal(10,2) DEFAULT NULL COMMENT 'cache calculada del total con iva',
`totalWithoutVat` decimal(10,2) DEFAULT NULL COMMENT 'cache calculada del total sin iva',
`weight` decimal(10,2) DEFAULT NULL COMMENT 'En caso de informar, se utilizará su valor para calcular el peso de la factura',
PRIMARY KEY (`id`),
KEY `Id_Cliente` (`clientFk`),
KEY `Id_Consigna` (`addressFk`),
@ -37124,7 +37125,7 @@ CREATE TABLE `ticket` (
CONSTRAINT `ticket_ibfk_9` FOREIGN KEY (`routeFk`) REFERENCES `route` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `tickets_fk11` FOREIGN KEY (`collectionFk__`) REFERENCES `collection` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `tickets_zone_fk` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
) ENGINE=InnoDB AUTO_INCREMENT=3750016 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@ -43256,6 +43257,40 @@ BEGIN
) t1;
RETURN totalAmount;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP FUNCTION IF EXISTS `invoiceOutAmount` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb4 */ ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `invoiceOut_getWeight`(vInvoice VARCHAR(15)) RETURNS decimal(10,2)
READS SQL DATA
BEGIN
DECLARE vTotalWeight DECIMAL(10,2);
SELECT SUM(CAST(IFNULL(i.stems, 1) * s.quantity *
IF(ic.grams, ic.grams, i.density * ic.cm3delivery / 1000)
/ 1000 AS DECIMAL(10,2)))
INTO vTotalWeight
FROM ticket t
JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk
JOIN itemCost ic ON ic.itemFk = i.id
AND ic.warehouseFk = t.warehouseFk
WHERE t.refFk = vInvoice
AND i.intrastatFk ;
RETURN vTotalWeight;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;

View File

@ -61,7 +61,7 @@ module.exports = Self => {
responseType: 'stream',
params: {
authorization: auth.id,
invoiceId: id
refFk: invoiceOut.ref
}
}).then(async response => {
const issued = invoiceOut.issued;

View File

@ -84,7 +84,7 @@ class Controller extends Section {
showCsvInvoice() {
this.vnReport.showCsv('invoice', {
recipientId: this.invoiceOut.client.id,
invoiceId: this.id
refFk: this.invoiceOut.ref
});
}
@ -95,7 +95,7 @@ class Controller extends Section {
return this.vnEmail.send('invoice', {
recipientId: this.invoiceOut.client.id,
recipient: $data.email,
invoiceId: this.id
refFk: this.invoiceOut.ref
});
}
@ -106,14 +106,14 @@ class Controller extends Section {
return this.vnEmail.sendCsv('invoice', {
recipientId: this.invoiceOut.client.id,
recipient: $data.email,
invoiceId: this.id
refFk: this.invoiceOut.ref
});
}
showExportationLetter() {
this.vnReport.show('exportation', {
recipientId: this.invoiceOut.client.id,
invoiceId: this.id
refFk: this.invoiceOut.ref
});
}

View File

@ -6,7 +6,8 @@ describe('vnInvoiceOutDescriptorMenu', () => {
let $httpParamSerializer;
const invoiceOut = {
id: 1,
client: {id: 1101}
client: {id: 1101},
ref: 'T1111111'
};
beforeEach(ngModule('invoiceOut'));
@ -40,8 +41,8 @@ describe('vnInvoiceOutDescriptorMenu', () => {
jest.spyOn(window, 'open').mockReturnThis();
const expectedParams = {
invoiceId: invoiceOut.id,
recipientId: invoiceOut.client.id
recipientId: invoiceOut.client.id,
refFk: invoiceOut.ref
};
const serializedParams = $httpParamSerializer(expectedParams);
const expectedPath = `api/csv/invoice/download?${serializedParams}`;
@ -84,9 +85,9 @@ describe('vnInvoiceOutDescriptorMenu', () => {
const $data = {email: 'brucebanner@gothamcity.com'};
const expectedParams = {
invoiceId: invoiceOut.id,
recipient: $data.email,
recipientId: invoiceOut.client.id
recipientId: invoiceOut.client.id,
refFk: invoiceOut.ref
};
const serializedParams = $httpParamSerializer(expectedParams);
@ -104,9 +105,9 @@ describe('vnInvoiceOutDescriptorMenu', () => {
const $data = {email: 'brucebanner@gothamcity.com'};
const expectedParams = {
invoiceId: invoiceOut.id,
recipient: $data.email,
recipientId: invoiceOut.client.id
recipientId: invoiceOut.client.id,
refFk: invoiceOut.ref
};
const serializedParams = $httpParamSerializer(expectedParams);

View File

@ -31,7 +31,7 @@ module.exports = {
if (invoiceOut) {
const args = Object.assign({
invoiceId: invoiceOut.id,
refFk: invoiceOut.ref,
recipientId: ticket.clientFk,
recipient: ticket.recipient,
replyTo: ticket.salesPersonEmail
@ -118,7 +118,7 @@ module.exports = {
await db.rawSql(`
INSERT INTO clientSample (clientFk, typeFk, companyFk) VALUES(?, ?, ?)
`, [ticket.clientFk, sample.id, ticket.companyFk])
`, [ticket.clientFk, sample.id, ticket.companyFk]);
}
} catch (error) {
// Domain not found

View File

@ -7,13 +7,13 @@ const sqlPath = path.join(__dirname, 'sql');
module.exports = async function(request, response, next) {
try {
const reqArgs = request.query;
if (!reqArgs.invoiceId)
throw new Error('The argument invoiceId is required');
if (!reqArgs.refFk)
throw new Error('The argument refFk is required');
const invoiceId = reqArgs.invoiceId;
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [invoiceId]);
const refFk = reqArgs.refFk;
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [refFk]);
const content = toCSV(sales);
const fileName = `invoice_${invoiceId}.csv`;
const fileName = `invoice_${refFk}.csv`;
response.setHeader('Content-type', 'text/csv');
response.setHeader('Content-Disposition', `inline; filename="${fileName}"`);

View File

@ -8,22 +8,22 @@ const sqlPath = path.join(__dirname, 'sql');
module.exports = async function(request, response, next) {
try {
const reqArgs = request.query;
if (!reqArgs.invoiceId)
throw new Error('The argument invoiceId is required');
if (!reqArgs.refFk)
throw new Error('The argument refFk is required');
const invoiceId = reqArgs.invoiceId;
const invoice = await db.findOneFromDef(`${sqlPath}/invoice`, [invoiceId]);
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [invoiceId]);
const refFk = reqArgs.refFk;
const invoice = await db.findOneFromDef(`${sqlPath}/invoice`, [refFk]);
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [refFk]);
const args = Object.assign({
invoiceId: (String(invoice.id)),
refFk: invoice.refFk,
recipientId: invoice.clientFk,
recipient: invoice.recipient,
replyTo: invoice.salesPersonEmail
}, response.locals);
const content = toCSV(sales);
const fileName = `invoice_${invoiceId}.csv`;
const fileName = `invoice_${refFk}.csv`;
const email = new Email('invoice', args);
await email.send({
overrideAttachments: true,

View File

@ -6,4 +6,5 @@ SELECT
FROM invoiceOut io
JOIN client c ON c.id = io.clientFk
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
WHERE io.id = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -31,5 +31,5 @@ FROM sale s
AND itc.countryFk = s2.countryFk
JOIN taxClass tc ON tc.id = itc.taxClassFk
JOIN invoiceOut io ON io.ref = t.refFk
WHERE io.id = ?
WHERE t.refFk = ?
ORDER BY s.ticketFk, s.created

View File

@ -38,7 +38,7 @@ module.exports = async function(request, response, next) {
connection.query('START TRANSACTION');
const args = Object.assign({
invoiceId: invoiceOut.id,
refFk: invoiceOut.ref,
recipientId: invoiceOut.clientFk,
recipient: invoiceOut.recipient,
replyTo: invoiceOut.salesPersonEmail

View File

@ -5,11 +5,11 @@ const emailFooter = new Component('email-footer');
module.exports = {
name: 'invoice',
async serverPrefetch() {
this.invoice = await this.fetchInvoice(this.invoiceId);
this.invoice = await this.fetchInvoice(this.refFk);
},
methods: {
fetchInvoice(invoiceId) {
return this.findOneFromDef('invoice', [invoiceId]);
fetchInvoice(refFk) {
return this.findOneFromDef('invoice', [refFk]);
},
},
components: {
@ -17,7 +17,7 @@ module.exports = {
'email-footer': emailFooter.build()
},
props: {
invoiceId: {
refFk: {
type: [Number, String],
required: true
}

View File

@ -4,4 +4,4 @@ SELECT
FROM invoiceOut io
JOIN ticket t ON t.refFk = io.ref
JOIN client c ON c.id = io.clientFk
WHERE io.id = ?
WHERE t.refFk = ?

View File

@ -5,14 +5,14 @@ const reportFooter = new Component('report-footer');
module.exports = {
name: 'exportation',
async serverPrefetch() {
this.invoice = await this.fetchInvoice(this.invoiceId);
this.invoice = await this.fetchInvoice(this.refFk);
if (!this.invoice)
throw new Error('Something went wrong');
},
methods: {
fetchInvoice(invoiceId) {
return this.findOneFromDef('invoice', [invoiceId]);
fetchInvoice(refFk) {
return this.findOneFromDef('invoice', [refFk]);
}
},
computed: {
@ -27,7 +27,7 @@ module.exports = {
'report-footer': reportFooter.build()
},
props: {
invoiceId: {
refFk: {
type: [Number, String],
required: true
}

View File

@ -3,4 +3,5 @@ SELECT
io.ref,
io.issued
FROM invoiceOut io
WHERE io.id = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -5,9 +5,9 @@ const reportFooter = new Component('report-footer');
module.exports = {
name: 'invoice-incoterms',
async serverPrefetch() {
this.invoice = await this.fetchInvoice(this.invoiceId);
this.client = await this.fetchClient(this.invoiceId);
this.incoterms = await this.fetchIncoterms(this.invoiceId);
this.invoice = await this.fetchInvoice(this.refFk);
this.client = await this.fetchClient(this.refFk);
this.incoterms = await this.fetchIncoterms(this.refFk);
if (!this.invoice)
throw new Error('Something went wrong');
@ -16,14 +16,14 @@ module.exports = {
},
methods: {
fetchInvoice(invoiceId) {
return this.findOneFromDef('invoice', [invoiceId]);
fetchInvoice(refFk) {
return this.findOneFromDef('invoice', [refFk]);
},
fetchClient(invoiceId) {
return this.findOneFromDef('client', [invoiceId]);
fetchClient(refFk) {
return this.findOneFromDef('client', [refFk]);
},
fetchIncoterms(invoiceId) {
return this.findOneFromDef('incoterms', [invoiceId, invoiceId, invoiceId]);
fetchIncoterms(refFk) {
return this.findOneFromDef('incoterms', [refFk, refFk, refFk]);
}
},
components: {
@ -31,7 +31,7 @@ module.exports = {
'report-footer': reportFooter.build()
},
props: {
invoiceId: {
refFk: {
type: [Number, String],
required: true
}

View File

@ -9,4 +9,5 @@ FROM vn.invoiceOut io
JOIN vn.country cty ON cty.id = c.countryFk
LEFT JOIN vn.invoiceOutSerial ios ON ios.code = io.serial
AND ios.taxAreaFk = 'CEE'
WHERE io.id = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -51,7 +51,7 @@ SELECT io.issued,
FROM vn.invoiceOut io
JOIN vn.ticket t ON t.refFk = io.ref
JOIN vn.saleVolume sv ON sv.ticketFk = t.id
WHERE io.id = ?
WHERE t.refFk = ?
) sub2 ON TRUE
JOIN vn.itemTaxCountry itc ON itc.countryFk = su.countryFk AND itc.itemFk = s.itemFk
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
@ -66,6 +66,7 @@ SELECT io.issued,
JOIN vn.sale s ON t.id = s.ticketFk
JOIN vn.item i ON i.id = s.itemFk
JOIN vn.intrastat ir ON ir.id = i.intrastatFk
WHERE io.id = ?
WHERE t.refFk = ?
)sub3 ON TRUE
WHERE io.id = ?
WHERE t.refFk = ?

View File

@ -14,4 +14,5 @@ FROM invoiceOut io
JOIN company cny ON cny.id = io.companyFk
JOIN supplierAccount sa ON sa.id = cny.supplierAccountFk
LEFT JOIN invoiceOutSerial ios ON ios.code = io.serial
WHERE io.id = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -7,15 +7,15 @@ const invoiceIncoterms = new Report('invoice-incoterms');
module.exports = {
name: 'invoice',
async serverPrefetch() {
this.invoice = await this.fetchInvoice(this.invoiceId);
this.client = await this.fetchClient(this.invoiceId);
this.taxes = await this.fetchTaxes(this.invoiceId);
this.intrastat = await this.fetchIntrastat(this.invoiceId);
this.rectified = await this.fetchRectified(this.invoiceId);
this.hasIncoterms = await this.fetchHasIncoterms(this.invoiceId);
this.invoice = await this.fetchInvoice(this.refFk);
this.client = await this.fetchClient(this.refFk);
this.taxes = await this.fetchTaxes(this.refFk);
this.intrastat = await this.fetchIntrastat(this.refFk);
this.rectified = await this.fetchRectified(this.refFk);
this.hasIncoterms = await this.fetchHasIncoterms(this.refFk);
const tickets = await this.fetchTickets(this.invoiceId);
const sales = await this.fetchSales(this.invoiceId);
const tickets = await this.fetchTickets(this.refFk);
const sales = await this.fetchSales(this.refFk);
const map = new Map();
@ -65,29 +65,29 @@ module.exports = {
}
},
methods: {
fetchInvoice(invoiceId) {
return this.findOneFromDef('invoice', [invoiceId]);
fetchInvoice(refFk) {
return this.findOneFromDef('invoice', [refFk]);
},
fetchClient(invoiceId) {
return this.findOneFromDef('client', [invoiceId]);
fetchClient(refFk) {
return this.findOneFromDef('client', [refFk]);
},
fetchTickets(invoiceId) {
return this.rawSqlFromDef('tickets', [invoiceId]);
fetchTickets(refFk) {
return this.rawSqlFromDef('tickets', [refFk]);
},
fetchSales(invoiceId) {
return this.rawSqlFromDef('sales', [invoiceId, invoiceId]);
fetchSales(refFk) {
return this.rawSqlFromDef('sales', [refFk, refFk]);
},
fetchTaxes(invoiceId) {
return this.rawSqlFromDef(`taxes`, [invoiceId]);
fetchTaxes(refFk) {
return this.rawSqlFromDef(`taxes`, [refFk]);
},
fetchIntrastat(invoiceId) {
return this.rawSqlFromDef(`intrastat`, [invoiceId]);
fetchIntrastat(refFk) {
return this.rawSqlFromDef(`intrastat`, [refFk, refFk, refFk]);
},
fetchRectified(invoiceId) {
return this.rawSqlFromDef(`rectified`, [invoiceId]);
fetchRectified(refFk) {
return this.rawSqlFromDef(`rectified`, [refFk]);
},
fetchHasIncoterms(invoiceId) {
return this.findValueFromDef(`hasIncoterms`, [invoiceId]);
fetchHasIncoterms(refFk) {
return this.findValueFromDef(`hasIncoterms`, [refFk]);
},
saleImport(sale) {
const price = sale.quantity * sale.price;
@ -115,9 +115,8 @@ module.exports = {
'invoice-incoterms': invoiceIncoterms.build()
},
props: {
invoiceId: {
type: [Number, String],
required: true
refFk: {
type: String
}
}
};

View File

@ -9,4 +9,5 @@ FROM vn.invoiceOut io
JOIN vn.country cty ON cty.id = c.countryFk
LEFT JOIN vn.invoiceOutSerial ios ON ios.code = io.serial
AND ios.taxAreaFk = 'CEE'
WHERE io.id = ?
LEFT JOIN vn.ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -3,6 +3,6 @@ SELECT IF(incotermsFk IS NULL, FALSE, TRUE) AS hasIncoterms
JOIN invoiceOut io ON io.ref = t.refFk
JOIN client c ON c.id = t.clientFk
JOIN address a ON a.id = t.addressFk
WHERE io.id = ?
WHERE t.refFk = ?
AND IF(c.hasToinvoiceByAddress = FALSE, c.defaultAddressFk, TRUE)
LIMIT 1

View File

@ -1,18 +1,22 @@
SELECT
ir.id AS code,
ir.description AS description,
CAST(SUM(IFNULL(i.stems,1) * s.quantity) AS DECIMAL(10,2)) as stems,
CAST(SUM(IF(sv.physicalWeight, sv.physicalWeight, i.density * sub.cm3delivery/1000000)) AS DECIMAL(10,2)) netKg,
CAST(SUM((s.quantity * s.price * (100 - s.discount) / 100 )) AS DECIMAL(10,2)) AS subtotal
FROM vn.sale s
LEFT JOIN (SELECT ic.itemFk, ic.cm3, ic.cm3delivery
FROM vn.itemCost ic
WHERE ic.cm3
GROUP BY ic.itemFk) sub ON s.itemFk = sub.itemFk
LEFT JOIN vn.saleVolume sv ON sv.saleFk = s.id
LEFT JOIN vn.ticket t ON t.id = s.ticketFk
LEFT JOIN vn.invoiceOut io ON io.ref = t.refFk
LEFT JOIN vn.item i ON i.id = s.itemFk
JOIN vn.intrastat ir ON ir.id = i.intrastatFk
WHERE io.id = ?
GROUP BY i.intrastatFk;
SELECT
ir.id code,
ir.description description,
CAST(SUM(IFNULL(i.stems, 1) * s.quantity) AS DECIMAL(10,2)) stems,
CAST(SUM(CAST(IFNULL(i.stems, 1) * s.quantity * IF(ic.grams, ic.grams, i.density * ic.cm3delivery / 1000) / 1000 AS DECIMAL(10,2)) *
IF(sub.weight, sub.weight / vn.invoiceOut_getWeight(?), 1)) AS DECIMAL(10,2)) netKg,
CAST(SUM((s.quantity * s.price * (100 - s.discount) / 100 )) AS DECIMAL(10,2)) subtotal
FROM vn.ticket t
JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.item i ON i.id = s.itemFk
JOIN vn.itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk
JOIN vn.intrastat ir ON ir.id = i.intrastatFk
LEFT JOIN (
SELECT t2.weight
FROM vn.ticket t2
WHERE refFk = ? AND weight
LIMIT 1
) sub ON TRUE
WHERE t.refFk = ?
AND i.intrastatFk
GROUP BY i.intrastatFk
ORDER BY i.intrastatFk;

View File

@ -13,4 +13,5 @@ FROM invoiceOut io
JOIN company cny ON cny.id = io.companyFk
JOIN supplierAccount sa ON sa.id = cny.supplierAccountFk
LEFT JOIN invoiceOutSerial ios ON ios.code = io.serial
WHERE io.id = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -6,4 +6,5 @@ SELECT
FROM vn.invoiceCorrection ic
JOIN vn.invoiceOut io ON io.id = ic.correctedFk
JOIN vn.invoiceCorrectionType ict ON ict.id = ic.invoiceCorrectionTypeFk
where ic.correctingFk = ?
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?

View File

@ -37,7 +37,7 @@ SELECT
JOIN vn.itemTaxCountry itc ON itc.countryFk = su.countryFk
AND itc.itemFk = s.itemFk
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
WHERE io.id = ?
WHERE t.refFk = ?
UNION ALL
SELECT
io.ref,
@ -69,4 +69,4 @@ SELECT
JOIN vn.company co ON co.id = io.companyFk
JOIN vn.supplierAccount sa ON sa.id = co.supplierAccountFk
JOIN vn.taxClass tc ON tc.id = ts.taxClassFk
WHERE io.id = ?
WHERE t.refFk = ?

View File

@ -6,6 +6,7 @@ SELECT
FROM invoiceOutTax iot
JOIN pgc ON pgc.code = iot.pgcFk
LEFT JOIN pgcEqu pe ON pe.equFk = pgc.code
JOIN invoiceOut io ON io.id = iot.invoiceOutFk
WHERE invoiceOutFk = ?
JOIN invoiceOut io ON io.id = iot.invoiceOutFk
LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ?
ORDER BY iot.id

View File

@ -4,5 +4,5 @@ SELECT
t.nickname
FROM invoiceOut io
JOIN ticket t ON t.refFk = io.ref
WHERE io.id = ?
WHERE t.refFk = ?
ORDER BY t.shipped