3852-client.search-panel2 #1111
|
@ -0,0 +1,56 @@
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`zone_getPostalCode`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getPostalCode`(vSelf INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve los códigos postales incluidos en una zona
|
||||||
|
*
|
||||||
|
* @return vNewTicket
|
||||||
|
*/
|
||||||
|
DECLARE vGeoFk INT DEFAULT NULL;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.zoneNodes;
|
||||||
|
CREATE TEMPORARY TABLE tmp.zoneNodes (
|
||||||
|
geoFk INT,
|
||||||
|
name VARCHAR(100),
|
||||||
|
parentFk INT,
|
||||||
|
sons INT,
|
||||||
|
isChecked BOOL DEFAULT 0,
|
||||||
|
zoneFk INT,
|
||||||
|
PRIMARY KEY zoneNodesPk (zoneFk, geoFk),
|
||||||
|
INDEX(geoFk))
|
||||||
|
ENGINE = MEMORY;
|
||||||
|
|
||||||
|
CALL zone_getLeaves2(vSelf, NULL , NULL);
|
||||||
|
|
||||||
|
UPDATE tmp.zoneNodes zn
|
||||||
|
SET isChecked = 0
|
||||||
|
WHERE parentFk IS NULL;
|
||||||
|
|
||||||
|
myLoop: LOOP
|
||||||
|
SET vGeoFk = NULL;
|
||||||
|
SELECT geoFk INTO vGeoFk
|
||||||
|
FROM tmp.zoneNodes zn
|
||||||
|
WHERE NOT isChecked
|
||||||
|
LIMIT 1;
|
||||||
|
|
||||||
|
CALL zone_getLeaves2(vSelf, vGeoFk, NULL);
|
||||||
|
UPDATE tmp.zoneNodes
|
||||||
|
SET isChecked = TRUE
|
||||||
|
WHERE geoFk = vGeoFk;
|
||||||
|
|
||||||
|
IF vGeoFk IS NULL THEN
|
||||||
|
LEAVE myLoop;
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
DELETE FROM tmp.zoneNodes
|
||||||
|
WHERE sons > 0;
|
||||||
|
|
||||||
|
SELECT zn.geoFk, zn.name
|
||||||
|
FROM tmp.zoneNodes zn
|
||||||
|
JOIN zone z ON z.id = zn.zoneFk;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,174 @@
|
||||||
|
|
||||||
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
const buildFilter = require('vn-loopback/util/filter').buildFilter;
|
||||||
|
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('filter', {
|
||||||
|
description: 'Find all clients matched by the filter',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'filter',
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'search',
|
||||||
|
type: 'string',
|
||||||
|
description: `If it's and integer searchs by id, otherwise it searchs by name`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'name',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The client name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'salesPersonFk',
|
||||||
|
type: 'number',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'fi',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The client fiscal id',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'socialName',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'city',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'postcode',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'provinceFk',
|
||||||
|
type: 'number',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'email',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'phone',
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'zoneFk',
|
||||||
|
type: 'number',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: ['object'],
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/filter`,
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.filter = async(ctx, filter, options) => {
|
||||||
|
const conn = Self.dataSource.connector;
|
||||||
|
const myOptions = {};
|
||||||
|
const postalCode = [];
|
||||||
|
const args = ctx.args;
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
if (args.zoneFk) {
|
||||||
|
query = `CALL vn.zone_getPostalCode(?)`;
|
||||||
|
const [geos] = await Self.rawSql(query, [args.zoneFk]);
|
||||||
|
for (let geo of geos)
|
||||||
|
postalCode.push(geo.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
const where = buildFilter(ctx.args, (param, value) => {
|
||||||
|
switch (param) {
|
||||||
|
case 'search':
|
||||||
|
return /^\d+$/.test(value)
|
||||||
|
? {'c.id': {inq: value}}
|
||||||
|
: {'c.name': {like: `%${value}%`}};
|
||||||
|
case 'name':
|
||||||
|
case 'salesPersonFk':
|
||||||
|
case 'fi':
|
||||||
|
case 'socialName':
|
||||||
|
case 'city':
|
||||||
|
case 'postcode':
|
||||||
|
case 'provinceFk':
|
||||||
|
case 'email':
|
||||||
|
case 'phone':
|
||||||
|
param = `c.${param}`;
|
||||||
|
return {[param]: value};
|
||||||
|
case 'zoneFk':
|
||||||
|
param = 'a.postalCode';
|
||||||
|
return {[param]: {inq: postalCode}};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
filter = mergeFilters(filter, {where});
|
||||||
|
|
||||||
|
const stmts = [];
|
||||||
|
const stmt = new ParameterizedSQL(
|
||||||
|
`SELECT
|
||||||
|
c.id,
|
||||||
|
c.name,
|
||||||
|
c.socialName,
|
||||||
|
c.fi,
|
||||||
|
c.credit,
|
||||||
|
c.creditInsurance,
|
||||||
|
c.phone,
|
||||||
|
c.mobile,
|
||||||
|
c.street,
|
||||||
|
c.city,
|
||||||
|
c.postcode,
|
||||||
|
c.email,
|
||||||
|
c.created,
|
||||||
|
c.isActive,
|
||||||
|
c.isVies,
|
||||||
|
c.isTaxDataChecked,
|
||||||
|
c.isEqualizated,
|
||||||
|
c.isFreezed,
|
||||||
|
c.hasToInvoice,
|
||||||
|
c.hasToInvoiceByAddress,
|
||||||
|
c.isToBeMailed,
|
||||||
|
c.hasSepaVnl,
|
||||||
|
c.hasLcr,
|
||||||
|
c.hasCoreVnl,
|
||||||
|
ct.id AS countryFk,
|
||||||
|
ct.country,
|
||||||
|
p.id AS provinceFk,
|
||||||
|
p.name AS province,
|
||||||
|
u.id AS salesPersonFk,
|
||||||
|
u.name AS salesPerson,
|
||||||
|
bt.code AS businessTypeFk,
|
||||||
|
bt.description AS businessType,
|
||||||
|
pm.id AS payMethodFk,
|
||||||
|
pm.name AS payMethod,
|
||||||
|
sti.CodigoIva AS sageTaxTypeFk,
|
||||||
|
sti.Iva AS sageTaxType,
|
||||||
|
stt.CodigoTransaccion AS sageTransactionTypeFk,
|
||||||
|
stt.Transaccion AS sageTransactionType
|
||||||
|
FROM client c
|
||||||
|
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||||
|
LEFT JOIN country ct ON ct.id = c.countryFk
|
||||||
|
LEFT JOIN province p ON p.id = c.provinceFk
|
||||||
|
LEFT JOIN businessType bt ON bt.code = c.businessTypeFk
|
||||||
|
LEFT JOIN payMethod pm ON pm.id = c.payMethodFk
|
||||||
|
LEFT JOIN sage.TiposIva sti ON sti.CodigoIva = c.taxTypeSageFk
|
||||||
|
LEFT JOIN sage.TiposTransacciones stt ON stt.CodigoTransaccion = c.transactionTypeSageFk
|
||||||
|
LEFT JOIN vn.address a ON a.id = c.defaultAddressFk
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
|
stmt.merge(conn.makeWhere(filter.where));
|
||||||
|
stmt.merge(conn.makePagination(filter));
|
||||||
|
|
||||||
|
const clientsIndex = stmts.push(stmt) - 1;
|
||||||
|
const sql = ParameterizedSQL.join(stmts, ';');
|
||||||
|
const result = await conn.executeStmt(sql, myOptions);
|
||||||
|
|
||||||
|
return clientsIndex === 0 ? result : result[clientsIndex];
|
||||||
|
};
|
||||||
|
};
|
|
@ -47,4 +47,5 @@ module.exports = Self => {
|
||||||
require('../methods/client/incotermsAuthorizationHtml')(Self);
|
require('../methods/client/incotermsAuthorizationHtml')(Self);
|
||||||
require('../methods/client/incotermsAuthorizationEmail')(Self);
|
require('../methods/client/incotermsAuthorizationEmail')(Self);
|
||||||
require('../methods/client/consumptionSendQueued')(Self);
|
require('../methods/client/consumptionSendQueued')(Self);
|
||||||
|
require('../methods/client/filter')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<vn-crud-model
|
<vn-crud-model
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="Clients"
|
url="Clients/filter"
|
||||||
order="id DESC"
|
order="id DESC"
|
||||||
limit="8"
|
limit="8"
|
||||||
data="clients">
|
data="clients">
|
||||||
|
@ -10,8 +10,7 @@
|
||||||
vn-focus
|
vn-focus
|
||||||
panel="vn-client-search-panel"
|
panel="vn-client-search-panel"
|
||||||
info="Search client by id or name"
|
info="Search client by id or name"
|
||||||
model="model"
|
model="model">
|
||||||
expr-builder="$ctrl.exprBuilder(param, value)">
|
|
||||||
</vn-searchbar>
|
</vn-searchbar>
|
||||||
</vn-portal>
|
</vn-portal>
|
||||||
<vn-portal slot="menu">
|
<vn-portal slot="menu">
|
||||||
|
|
|
@ -2,32 +2,6 @@ import ngModule from '../module';
|
||||||
import ModuleMain from 'salix/components/module-main';
|
import ModuleMain from 'salix/components/module-main';
|
||||||
|
|
||||||
export default class Client extends ModuleMain {
|
export default class Client extends ModuleMain {
|
||||||
exprBuilder(param, value) {
|
|
||||||
switch (param) {
|
|
||||||
case 'search':
|
|
||||||
return /^\d+$/.test(value)
|
|
||||||
? {id: value}
|
|
||||||
: {or: [{name: {like: `%${value}%`}}, {socialName: {like: `%${value}%`}}]};
|
|
||||||
case 'phone':
|
|
||||||
return {
|
|
||||||
or: [
|
|
||||||
{phone: value},
|
|
||||||
{mobile: value}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
case 'name':
|
|
||||||
case 'socialName':
|
|
||||||
case 'city':
|
|
||||||
case 'email':
|
|
||||||
return {[param]: {like: `%${value}%`}};
|
|
||||||
case 'id':
|
|
||||||
case 'fi':
|
|
||||||
case 'postcode':
|
|
||||||
case 'provinceFk':
|
|
||||||
case 'salesPersonFk':
|
|
||||||
return {[param]: value};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngModule.vnComponent('vnClient', {
|
ngModule.vnComponent('vnClient', {
|
||||||
|
|
|
@ -58,6 +58,13 @@
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Province">
|
label="Province">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
|
<vn-autocomplete
|
||||||
|
ng-model="filter.zoneFk"
|
||||||
|
url="Zones"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
label="Zone">
|
||||||
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
|
|
Loading…
Reference in New Issue