8355-testToMaster #3336

Merged
alexm merged 241 commits from 8355-testToMaster into master 2025-01-07 06:44:57 +00:00
12 changed files with 122 additions and 46 deletions
Showing only changes of commit 03ba892581 - Show all commits

View File

@ -29,35 +29,34 @@ module.exports = Self => {
});
Self.sendToSupport = async(ctx, reason, additionalData) => {
const userId = ctx.req.accessToken.userId;
const emailUser =
await Self.app.models.EmailUser.findById(ctx.req.accessToken.userId, {fields: ['email']});
await Self.app.models.EmailUser.findById(userId, {fields: ['email']});
let html = `<strong>Motivo</strong>:<br/>${reason}<br/>`;
html += `<strong>Usuario</strong>:<br/>${ctx.req.accessToken.userId} ${emailUser.email}<br/>`;
let html = `<h2>Motivo: ${reason}</h2>`;
html += `<h3>Usuario: ${userId} ${emailUser.email}</h3>`;
html += `<h3>Additional Data:</h3>`;
html += '<ul>';
for (const [key, val] of Object.entries(additionalData)) {
if (key !== 'config') html += `<li>${key}: ${parse(val)}</li>`;
else {
html += `<li>${key}:</li><ul style="list-style-type: square;">`;
for (const [confKey, confVal] of Object.entries(val))
html += `<li>${confKey}: ${parse(confVal)}</li>`;
html += '</ul>';
}
}
html += '</ul>';
delete additionalData.backError.config.headers.Authorization;
const httpRequest = JSON.parse(additionalData?.httpRequest);
if (httpRequest)
delete httpRequest.config.headers.Authorization;
additionalData.httpRequest = httpRequest;
for (const data in additionalData)
html += `<strong>${data}</strong>:<br/>${tryParse(additionalData[data])}<br/>`;
const subjectReason = httpRequest?.data?.error;
const {message, path, name} = additionalData;
await smtp.send({
to: `${config.app.reportEmail}, ${emailUser.email}`,
subject:
'[Support-Salix] ' +
additionalData?.frontPath + ' ' +
subjectReason?.name + ':' +
subjectReason?.message,
subject: `[Support-Salix] ${path} ${name}: ${message}`,
html
});
};
function tryParse(value) {
function parse(value) {
try {
try {
value = JSON.parse(value);

View File

@ -2128,7 +2128,7 @@ INSERT INTO `ACL` VALUES (746,'Claim','getSummary','READ','ALLOW','ROLE','claimV
INSERT INTO `ACL` VALUES (747,'CplusRectificationType','*','READ','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (748,'SiiTypeInvoiceOut','*','READ','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (749,'InvoiceCorrectionType','*','READ','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (750,'InvoiceOut','transferInvoice','WRITE','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (750,'InvoiceOut','transfer','WRITE','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (751,'Application','executeProc','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (752,'Application','executeFunc','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (753,'NotificationSubscription','getList','READ','ALLOW','ROLE','employee',NULL);

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.`zone` MODIFY COLUMN `price` DECIMAL(10,2);

View File

@ -27,18 +27,6 @@ export default class Controller extends Component {
setTimeout(() => element.classList.add('shown'), 30);
shape.element = element;
if (data.additionalData && this.vnToken.token) {
this.additionalData = data.additionalData;
let supportButton = document.createElement('i');
supportButton.setAttribute('class', 'material-icons clickable');
supportButton.addEventListener('click', () => this.$.supportDialog.show());
element.appendChild(supportButton);
let buttonIcon = 'support_agent';
buttonIcon = document.createTextNode(buttonIcon);
supportButton.appendChild(buttonIcon);
}
if (shape.type)
element.classList.add(shape.type);

View File

@ -9,13 +9,6 @@ export default class Controller extends Dialog {
responseHandler(response) {
if (response !== 'accept')
return super.responseHandler(response);
this.$http.post('Ostickets/send-to-support', {
reason: this.reason,
additionalData: this.additionalData
})
.then(() => super.responseHandler(response))
.then(() => this.vnApp.showSuccess(this.$t('Email sended!')));
}
}

View File

@ -247,5 +247,7 @@
"The raid information is not correct": "The raid information is not correct",
"Payment method is required": "Payment method is required",
"Sales already moved": "Sales already moved",
"Holidays to past days not available": "Holidays to past days not available"
"Holidays to past days not available": "Holidays to past days not available",
"There are tickets to be invoiced": "There are tickets to be invoiced for this zone, please delete them first",
"Price cannot be blank": "Price cannot be blank"
}

View File

@ -388,10 +388,10 @@
"You do not have permission to modify the booked field": "No tienes permisos para modificar el campo contabilizada",
"ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}",
"The web user's email already exists": "El correo del usuario web ya existe",
"Sales already moved": "Ya han sido transferidas",
"The raid information is not correct": "La información de la redada no es correcta",
"There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero",
"Sales already moved": "Ya han sido transferidas",
"The raid information is not correct": "La información de la redada no es correcta",
"There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero",
"Price cannot be blank": "Price cannot be blank",
"An item type with the same code already exists": "Un tipo con el mismo código ya existe",
"Holidays to past days not available": "Las vacaciones a días pasados no están disponibles"
}

View File

@ -89,6 +89,11 @@ module.exports = Self => {
type: 'number',
description: `The alert level of the tickets`
},
{
arg: 'packing',
type: 'string',
description: `The packing of the items`
},
{
arg: 'countryFk',
type: 'number',
@ -174,7 +179,7 @@ module.exports = Self => {
stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.filter
(PRIMARY KEY (id))
ENGINE = MEMORY
ENGINE = InnoDB
SELECT t.id,
t.shipped,
CAST(DATE(t.shipped) AS CHAR) shippedDate,
@ -200,10 +205,18 @@ module.exports = Self => {
u.name userName,
c.salesPersonFk,
c.credit,
pm.name payMethod,
z.hour zoneLanding,
z.name zoneName,
z.id zoneFk,
st.classColor,
d.id departmentFk,
d.name department,
(SELECT GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk SEPARATOR ',')
FROM sale s
JOIN item i ON i.id = s.itemFk
WHERE s.ticketFk = t.id
) AS packing,
TIME_FORMAT(t.shipped, '%H:%i') preparationHour,
TIME_FORMAT(z.hour, '%H:%i') theoreticalhour,
TIME_FORMAT(zed.etc, '%H:%i') practicalHour
@ -217,7 +230,10 @@ module.exports = Self => {
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
LEFT JOIN state st ON st.id = ts.stateFk
LEFT JOIN client c ON c.id = t.clientFk
LEFT JOIN payMethod pm ON pm.id = c.payMethodFk
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
LEFT JOIN workerDepartment wd ON wd.workerFk = wk.id
LEFT JOIN department d ON d.id = wd.departmentFk
LEFT JOIN account.user u ON u.id = wk.id
LEFT JOIN (
SELECT zoneFk,
@ -362,6 +378,7 @@ module.exports = Self => {
}
case 'agencyModeFk':
case 'warehouseFk':
case 'packing':
case 'countryFk':
param = `f.${param}`;
return {[param]: value};

View File

@ -14,4 +14,18 @@ module.exports = Self => {
Self.validatesPresenceOf('agencyModeFk', {
message: `Agency cannot be blank`
});
Self.validatesPresenceOf('price', {
message: 'Price cannot be blank'
});
Self.validateAsync('price', priceIsValid, {
message: 'Price must be greater than 0'
});
async function priceIsValid(err, done) {
if (this.price <= 0)
err();
done();
}
};

View File

@ -0,0 +1,6 @@
subject: Incoterms Authorization
title: Incoterms Authorization
description:
dear: Dear customer
instructions: Please find attached the Incoterms authorization form, which you must complete and sign.
conclusion: Thank you for your attention!

View File

@ -0,0 +1,16 @@
reportName: balance-compensation
Place: Algemesí, on
Compensation: Compensation of debtor and creditor balances
In one hand: On one hand
CIF: with CIF
NIF: with NIF
Home: and address located at
In other hand: On the other hand
Sr: Mr./Ms.
Agree: Agree
Date: On the date of
Compensate: the balance of has been compensated
From client: from the client/supplier
Against the balance of: against the balance of
Reception: Please confirm receipt of this compensation at the email
Greetings: Best regards,

View File

@ -0,0 +1,39 @@
reportName: autorization-incoterms
description: '<em>{socialName}</em> a duly constituted and responsible company <em>limited</em>
and registered under corporate law {country} and here represented by {socialName}, with address in {address},
CIF <em>{fiscalID}</em>. Hereinafter referred to as {name}.'
issued: 'In {0}, on {1} of {2} of {3}'
client: 'Customer {0}'
declaration: '<em>{socialName}</em> hereby declares that:'
declarations:
- 'All purchases made by {socialName} with {companyName} They are delivered according to the conditions defined in the Incoterm.'
- '{socialName} recognizes that it is important for {companyName} have
proof of intra-community delivery of the goods to {destinationCountry} to
be able to invoice with 0% VAT.'
- 'Therefore, by signing this agreement, {socialName} declares that all goods
purchased from {companyName} will be delivered to {destinationCountry}.'
- 'Besides, {socialName} shall, at the first request of {companyName},
provide proof that all products purchased from {companyName} have
been delivered in {destinationCountry}.'
- 'In addition to the above, {companyName} will provide to {socialName}
a monthly summary that includes all bills (and corresponding deliveries).
{socialName} will sign and return the monthly summary to {companyName},
S.L. within 5 days of receiving the summary.'
signer:
representative: Representative
representativeRole: Position of the representative
signed: Date of signature
manager: Manager
months:
- 'January'
- 'February'
- 'March'
- 'April'
- 'May'
- 'June'
- 'July'
- 'August'
- 'September'
- 'October'
- 'November'
- 'December'