Merge branch 'dev' into 1880-refactor_loggable
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
0348b79f0d
|
@ -0,0 +1,47 @@
|
|||
USE `vn`;
|
||||
CREATE
|
||||
OR REPLACE ALGORITHM = UNDEFINED
|
||||
DEFINER = `root`@`%`
|
||||
SQL SECURITY DEFINER
|
||||
VIEW `vn`.`zoneEstimatedDelivery` AS
|
||||
SELECT
|
||||
`t`.`zoneFk` AS `zoneFk`,
|
||||
CAST((CURDATE() + INTERVAL ((HOUR(`zc`.`hour`) * 60) + MINUTE(`zc`.`hour`)) MINUTE)
|
||||
AS TIME) AS `hourTheoretical`,
|
||||
CAST(SUM(`sv`.`volume`) AS DECIMAL (5 , 1 )) AS `totalVolume`,
|
||||
CAST(SUM(IF((`s`.`alertLevel` < 2),
|
||||
`sv`.`volume`,
|
||||
0))
|
||||
AS DECIMAL (5 , 1 )) AS `remainingVolume`,
|
||||
GREATEST(IFNULL(`lhp`.`m3`, 0),
|
||||
IFNULL(`dl`.`minSpeed`, 0)) AS `speed`,
|
||||
CAST((`zc`.`hour` + INTERVAL ((-(SUM(IF((`s`.`alertLevel` < 2),
|
||||
`sv`.`volume`,
|
||||
0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0),
|
||||
IFNULL(`dl`.`minSpeed`, 0))) MINUTE)
|
||||
AS TIME) AS `hourEffective`,
|
||||
FLOOR(((-(SUM(IF((`s`.`alertLevel` < 2),
|
||||
`sv`.`volume`,
|
||||
0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0),
|
||||
IFNULL(`dl`.`minSpeed`, 0)))) AS `minutesLess`,
|
||||
CAST((`zc`.`hour` + INTERVAL ((-(SUM(IF((`s`.`alertLevel` < 2),
|
||||
`sv`.`volume`,
|
||||
0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0),
|
||||
IFNULL(`dl`.`minSpeed`, 0))) MINUTE)
|
||||
AS TIME) AS `etc`
|
||||
FROM
|
||||
((((((((`ticket` `t`
|
||||
JOIN `ticketStateToday` `tst` ON ((`tst`.`ticket` = `t`.`id`)))
|
||||
JOIN `state` `s` ON ((`s`.`id` = `tst`.`state`)))
|
||||
JOIN `saleVolume` `sv` ON ((`sv`.`ticketFk` = `t`.`id`)))
|
||||
LEFT JOIN `lastHourProduction` `lhp` ON ((`lhp`.`warehouseFk` = `t`.`warehouseFk`)))
|
||||
JOIN `warehouse` `w` ON ((`w`.`id` = `t`.`warehouseFk`)))
|
||||
JOIN `warehouseAlias` `wa` ON ((`wa`.`id` = `w`.`aliasFk`)))
|
||||
LEFT JOIN `zoneClosure` `zc` ON (((`zc`.`zoneFk` = `t`.`zoneFk`)
|
||||
AND (`zc`.`dated` = CURDATE()))))
|
||||
LEFT JOIN `cache`.`departure_limit` `dl` ON (((`dl`.`warehouse_id` = `t`.`warehouseFk`)
|
||||
AND (`dl`.`fecha` = CURDATE()))))
|
||||
WHERE
|
||||
((`wa`.`name` = 'Silla')
|
||||
AND (CAST(`t`.`shipped` AS DATE) = CURDATE()))
|
||||
GROUP BY `t`.`zoneFk`;
|
|
@ -0,0 +1,16 @@
|
|||
CREATE
|
||||
OR REPLACE ALGORITHM = UNDEFINED
|
||||
DEFINER = `root`@`%`
|
||||
SQL SECURITY DEFINER
|
||||
VIEW `vn`.`zone_ETD` AS
|
||||
SELECT
|
||||
`zed`.`zoneFk` AS `zoneFk`,
|
||||
`zed`.`hourTheoretical` AS `HoraTeórica`,
|
||||
`zed`.`totalVolume` AS `volumenTotal`,
|
||||
`zed`.`remainingVolume` AS `volumenPendiente`,
|
||||
`zed`.`speed` AS `velocidad`,
|
||||
`zed`.`hourEffective` AS `HoraPráctica`,
|
||||
`zed`.`minutesLess` AS `minutesLess`,
|
||||
`zed`.`etc` AS `etc`
|
||||
FROM
|
||||
`vn`.`zoneEstimatedDelivery` `zed`
|
|
@ -88,13 +88,18 @@ INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`,
|
|||
(19,'Francia', 1, 'FR', 1, 27),
|
||||
(30,'Canarias', 1, 'IC', 1, 24);
|
||||
|
||||
INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`)
|
||||
INSERT INTO `vn`.`warehouseAlias`(`id`, `name`)
|
||||
VALUES
|
||||
(1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1),
|
||||
(2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1),
|
||||
(3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0),
|
||||
(4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0),
|
||||
(5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0);
|
||||
(1, 'Main Warehouse'),
|
||||
(2, 'Silla');
|
||||
|
||||
INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`)
|
||||
VALUES
|
||||
(1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2),
|
||||
(2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2),
|
||||
(3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2),
|
||||
(4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2),
|
||||
(5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2);
|
||||
|
||||
INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPreparedByPacking`, `code`, `pickingPlacement`, `path`)
|
||||
VALUES
|
||||
|
@ -111,10 +116,6 @@ INSERT INTO `vn`.`shelving` (`code`, `parkingFk`, `isPrinted`, `priority`, `park
|
|||
('GVC', '1', '0', '1', '0', '106'),
|
||||
('HEJ', '2', '0', '1', '0', '106');
|
||||
|
||||
INSERT INTO `vn`.`warehouseAlias`(`id`, `name`)
|
||||
VALUES
|
||||
(1, 'Main Warehouse');
|
||||
|
||||
INSERT INTO `vn`.`accountingType`(`id`, `description`)
|
||||
VALUES
|
||||
(1, 'Digital money'),
|
||||
|
@ -510,7 +511,23 @@ INSERT INTO `vn`.`zoneWarehouse` (`id`, `zoneFk`, `warehouseFk`)
|
|||
(11, 11, 5),
|
||||
(12, 12, 4),
|
||||
(13, 13, 5);
|
||||
|
||||
|
||||
INSERT INTO `vn`.`zoneClosure` (`zoneFk`, `dated`, `hour`)
|
||||
VALUES
|
||||
(1, CURDATE(), '23:59'),
|
||||
(2, CURDATE(), '23:59'),
|
||||
(3, CURDATE(), '23:59'),
|
||||
(4, CURDATE(), '23:59'),
|
||||
(5, CURDATE(), '23:59'),
|
||||
(6, CURDATE(), '23:59'),
|
||||
(7, CURDATE(), '23:59'),
|
||||
(8, CURDATE(), '23:59'),
|
||||
(9, CURDATE(), '23:59'),
|
||||
(10, CURDATE(), '23:59'),
|
||||
(11, CURDATE(), '23:59'),
|
||||
(12, CURDATE(), '23:59'),
|
||||
(13, CURDATE(), '23:59');
|
||||
|
||||
INSERT INTO `vn`.`zoneConfig` (`scope`) VALUES ('1');
|
||||
|
||||
INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk`)
|
||||
|
|
|
@ -631,7 +631,7 @@ export default {
|
|||
},
|
||||
ordersIndex: {
|
||||
searchResult: 'vn-order-index vn-card > vn-table > div > vn-tbody > a.vn-tr',
|
||||
firstSearchResultTotal: 'vn-order-index vn-card > vn-table > div > vn-tbody vn-tr vn-td:nth-child(7)',
|
||||
secondSearchResultTotal: 'vn-order-index vn-card > vn-table > div > vn-tbody vn-tr:nth-child(2) vn-td:nth-child(9)',
|
||||
searchResultDate: 'vn-order-index vn-table vn-tbody > a:nth-child(1) > vn-td:nth-child(4)',
|
||||
searchResultAddress: 'vn-order-index vn-table vn-tbody > a:nth-child(1) > vn-td:nth-child(6)',
|
||||
searchButton: 'vn-searchbar vn-icon[icon="search"]',
|
||||
|
|
|
@ -8,6 +8,7 @@ describe('Order summary path', () => {
|
|||
browser = await getBrowser();
|
||||
page = browser.page;
|
||||
await page.loginAndModule('employee', 'order');
|
||||
await page.waitFor(2000);
|
||||
await page.accessToSearchResult('16');
|
||||
});
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@ describe('Order Index', () => {
|
|||
await browser.close();
|
||||
});
|
||||
|
||||
it(`should check the first search result doesn't contain a total of 0€`, async() => {
|
||||
it(`should check the second search result doesn't contain a total of 0€`, async() => {
|
||||
await page.waitToClick(selectors.ordersIndex.searchButton);
|
||||
const result = await page.waitToGetProperty(selectors.ordersIndex.firstSearchResultTotal, 'innerText');
|
||||
const result = await page.waitToGetProperty(selectors.ordersIndex.secondSearchResultTotal, 'innerText');
|
||||
|
||||
expect(result).not.toContain('0.00');
|
||||
});
|
||||
|
@ -26,8 +26,8 @@ describe('Order Index', () => {
|
|||
await page.waitToClick(selectors.ordersIndex.openAdvancedSearch);
|
||||
await page.waitToClick(selectors.ordersIndex.advancedSearchShowEmptyCheckbox);
|
||||
await page.waitToClick(selectors.ordersIndex.advancedSearchButton);
|
||||
await page.waitForTextInElement(selectors.ordersIndex.firstSearchResultTotal, '0.00');
|
||||
const result = await page.waitToGetProperty(selectors.ordersIndex.firstSearchResultTotal, 'innerText');
|
||||
await page.waitForTextInElement(selectors.ordersIndex.secondSearchResultTotal, '0.00');
|
||||
const result = await page.waitToGetProperty(selectors.ordersIndex.secondSearchResultTotal, 'innerText');
|
||||
|
||||
expect(result).toContain('0.00');
|
||||
});
|
||||
|
|
|
@ -133,5 +133,6 @@
|
|||
"Distance must be lesser than 1000": "La distancia debe ser inferior a 1000",
|
||||
"This ticket is deleted": "Este ticket está eliminado",
|
||||
"A travel with this data already exists": "Ya existe un travel con estos datos",
|
||||
"This thermograph id already exists": "La id del termógrafo ya existe"
|
||||
"This thermograph id already exists": "La id del termógrafo ya existe",
|
||||
"ORDER_ALREADY_CONFIRMED": "ORDER_ALREADY_CONFIRMED"
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
|
||||
// #2304
|
||||
xdescribe('regularizeClaim()', () => {
|
||||
describe('regularizeClaim()', () => {
|
||||
const claimFk = 1;
|
||||
const pendentState = 1;
|
||||
const resolvedState = 3;
|
||||
|
|
|
@ -133,7 +133,6 @@ module.exports = Self => {
|
|||
});
|
||||
|
||||
filter = mergeFilters(filter, {where});
|
||||
|
||||
let stmts = [];
|
||||
let stmt;
|
||||
|
||||
|
@ -157,14 +156,20 @@ module.exports = Self => {
|
|||
c.salesPersonFk,
|
||||
u.nickname workerNickname,
|
||||
u.name name,
|
||||
co.code companyCode
|
||||
co.code companyCode,
|
||||
zed.zoneFk,
|
||||
zed.hourTheoretical,
|
||||
zed.hourEffective
|
||||
FROM hedera.order o
|
||||
LEFT JOIN address a ON a.id = o.address_id
|
||||
LEFT JOIN agencyMode am ON am.id = o.agency_id
|
||||
LEFT JOIN client c ON c.id = o.customer_id
|
||||
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
|
||||
LEFT JOIN account.user u ON u.id = wk.userFk
|
||||
LEFT JOIN company co ON co.id = o.company_id`);
|
||||
LEFT JOIN company co ON co.id = o.company_id
|
||||
LEFT JOIN orderTicket ot ON ot.orderFk = o.id
|
||||
LEFT JOIN ticket t ON t.id = ot.ticketFk
|
||||
LEFT JOIN zoneEstimatedDelivery zed ON zed.zoneFk = t.zoneFk`);
|
||||
|
||||
if (args && args.ticketFk) {
|
||||
stmt.merge({
|
||||
|
@ -172,7 +177,11 @@ module.exports = Self => {
|
|||
});
|
||||
}
|
||||
|
||||
stmt.merge(conn.makeSuffix(filter));
|
||||
stmt.merge(conn.makeWhere(filter.where));
|
||||
stmt.merge({
|
||||
sql: `GROUP BY o.id`
|
||||
});
|
||||
stmt.merge(conn.makePagination(filter));
|
||||
stmts.push(stmt);
|
||||
|
||||
stmts.push(`
|
||||
|
|
|
@ -10,11 +10,13 @@
|
|||
<vn-thead>
|
||||
<vn-tr>
|
||||
<vn-th field="id" number>Id</vn-th>
|
||||
<vn-th field="clientFk">Client</vn-th>
|
||||
<vn-th field="salesPersonFk">Sales person</vn-th>
|
||||
<vn-th field="clientFk">Client</vn-th>
|
||||
<vn-th field="isConfirmed" center>Confirmed</vn-th>
|
||||
<vn-th field="created" center>Created</vn-th>
|
||||
<vn-th field="landed" default-order="DESC" center>Landed</vn-th>
|
||||
<vn-th field="created" center title ="Theoretical hour" >T. Hour</vn-th>
|
||||
<vn-th field="created" center>Real hour </vn-th>
|
||||
<vn-th center>Total</vn-th>
|
||||
</vn-tr>
|
||||
</vn-thead>
|
||||
|
@ -24,13 +26,6 @@
|
|||
class="clickable search-result"
|
||||
ui-sref="order.card.summary({id: {{::order.id}}})">
|
||||
<vn-td number>{{::order.id}}</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
vn-click-stop="clientDescriptor.show($event, order.clientFk)"
|
||||
class="link">
|
||||
{{::order.clientName}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td expand>
|
||||
<span
|
||||
vn-click-stop="workerDescriptor.show($event, order.salesPersonFk)"
|
||||
|
@ -38,14 +33,27 @@
|
|||
{{::order.name | dashIfEmpty}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td center>
|
||||
<vn-td expand>
|
||||
<span
|
||||
vn-click-stop="clientDescriptor.show($event, order.clientFk)"
|
||||
class="link">
|
||||
{{::order.clientName}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td center>
|
||||
<vn-check
|
||||
ng-model="order.isConfirmed"
|
||||
disabled="true">
|
||||
</vn-check>
|
||||
</vn-td>
|
||||
<vn-td center>{{::order.created | date: 'dd/MM/yyyy HH:mm'}}</vn-td>
|
||||
<vn-td center>{{::order.landed | date:'dd/MM/yyyy'}}</vn-td>
|
||||
<vn-td center>
|
||||
<span class="chip {{$ctrl.compareDate(order.landed)}}">
|
||||
{{::order.landed | date:'dd/MM/yyyy'}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td shrink>{{::order.hourTheoretical | date: 'HH:mm'}}</vn-td>
|
||||
<vn-td shrink>{{::ticket.hourEffective | date: 'HH:mm'}}</vn-td>
|
||||
<vn-td number>{{::order.total | currency: 'EUR': 2 | dashIfEmpty}}</vn-td>
|
||||
<vn-td shrink>
|
||||
<vn-icon-button
|
||||
|
|
|
@ -6,6 +6,20 @@ export default class Controller extends Section {
|
|||
this.selectedOrder = order;
|
||||
this.$.summary.show();
|
||||
}
|
||||
|
||||
compareDate(date) {
|
||||
let today = new Date();
|
||||
today.setHours(0, 0, 0, 0);
|
||||
let timeTicket = new Date(date);
|
||||
timeTicket.setHours(0, 0, 0, 0);
|
||||
|
||||
let comparation = today - timeTicket;
|
||||
|
||||
if (comparation == 0)
|
||||
return 'warning';
|
||||
if (comparation < 0)
|
||||
return 'success';
|
||||
}
|
||||
}
|
||||
|
||||
ngModule.component('vnOrderIndex', {
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
import './index.js';
|
||||
describe('Component vnOrderIndex', () => {
|
||||
let controller;
|
||||
let $window;
|
||||
let orders = [{
|
||||
id: 1,
|
||||
clientFk: 1,
|
||||
isConfirmed: false
|
||||
}, {
|
||||
id: 2,
|
||||
clientFk: 1,
|
||||
isConfirmed: false
|
||||
}, {
|
||||
id: 3,
|
||||
clientFk: 1,
|
||||
isConfirmed: true
|
||||
}];
|
||||
|
||||
beforeEach(ngModule('order'));
|
||||
|
||||
beforeEach(inject(($componentController, _$window_,) => {
|
||||
$window = _$window_;
|
||||
const $element = angular.element('<vn-order-index></vn-order-index>');
|
||||
controller = $componentController('vnOrderIndex', {$element});
|
||||
}));
|
||||
|
||||
describe('compareDate()', () => {
|
||||
it('should return warning when the date is the present', () => {
|
||||
let curDate = new Date();
|
||||
let result = controller.compareDate(curDate);
|
||||
|
||||
expect(result).toEqual('warning');
|
||||
});
|
||||
|
||||
it('should return sucess when the date is in the future', () => {
|
||||
let futureDate = new Date();
|
||||
futureDate = futureDate.setDate(futureDate.getDate() + 10);
|
||||
let result = controller.compareDate(futureDate);
|
||||
|
||||
expect(result).toEqual('success');
|
||||
});
|
||||
|
||||
it('should return undefined when the date is in the past', () => {
|
||||
let pastDate = new Date();
|
||||
pastDate = pastDate.setDate(pastDate.getDate() - 10);
|
||||
let result = controller.compareDate(pastDate);
|
||||
|
||||
expect(result).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe('preview()', () => {
|
||||
it('should show the dialog summary', () => {
|
||||
controller.$.summary = {show: () => {}};
|
||||
jest.spyOn(controller.$.summary, 'show');
|
||||
|
||||
let event = new MouseEvent('click', {
|
||||
view: $window,
|
||||
bubbles: true,
|
||||
cancelable: true
|
||||
});
|
||||
controller.preview(event, orders[0]);
|
||||
|
||||
expect(controller.$.summary.show).toHaveBeenCalledWith();
|
||||
});
|
||||
});
|
||||
});
|
|
@ -21,4 +21,6 @@ Ascendant: Ascendente
|
|||
Descendant: Descendente
|
||||
Created from: Creado desde
|
||||
Search order by id: Buscar el pedido por identificador
|
||||
order: pedido
|
||||
order: pedido
|
||||
Confirm lines: Confirmar las lineas
|
||||
Confirm: Confirmar
|
|
@ -1,5 +1,14 @@
|
|||
<vn-card class="summary">
|
||||
<h5>{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} - {{$ctrl.summary.client.salesPerson.id}}</h5>
|
||||
<h5>{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} - {{$ctrl.summary.client.salesPerson.id}}
|
||||
<vn-button
|
||||
disabled="$ctrl.order.isConfirmed"
|
||||
class="flat"
|
||||
style="color: inherit;"
|
||||
label="Confirm"
|
||||
ng-click="$ctrl.save()"
|
||||
vn-tooltip="Confirm lines">
|
||||
</vn-button>
|
||||
</h5>
|
||||
<vn-horizontal class="ticketSummary__data">
|
||||
<vn-one>
|
||||
<vn-label-value label="Id"
|
||||
|
|
|
@ -21,6 +21,15 @@ class Controller extends Section {
|
|||
if (this.order && this.order.id)
|
||||
this.setSummary();
|
||||
}
|
||||
|
||||
save() {
|
||||
this.$http.post(`Orders/${this.order.id}/confirm`).then(() => {
|
||||
this.vnApp.showSuccess(this.$t('Order confirmed'));
|
||||
this.$state.go(`ticket.index`, {
|
||||
q: JSON.stringify({clientFk: this.order.clientFk})
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ngModule.component('vnOrderSummary', {
|
||||
|
|
|
@ -3,6 +3,21 @@
|
|||
vn-order-summary .summary{
|
||||
max-width: $width-lg;
|
||||
|
||||
h5 {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
|
||||
|
||||
span {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
vn-button {
|
||||
flex: none
|
||||
}
|
||||
}
|
||||
& > div > vn-horizontal > vn-one {
|
||||
min-width: 160px !important;
|
||||
|
||||
|
|
|
@ -28,5 +28,8 @@
|
|||
},
|
||||
"ZoneWarehouse": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"ZoneEstimatedDelivery": {
|
||||
"dataSource": "vn"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "ZoneEstimatedDelivery",
|
||||
"base": "VnModel",
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "zoneEstimatedDelivery"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"zoneFk": {
|
||||
"id": true,
|
||||
"type": "Number"
|
||||
},
|
||||
"hourTheoretical": {
|
||||
"type": "date"
|
||||
},
|
||||
"totalVolume": {
|
||||
"type": "Number"
|
||||
},
|
||||
"remainingVolume": {
|
||||
"type": "Number"
|
||||
},
|
||||
"speed": {
|
||||
"type": "Number"
|
||||
},
|
||||
"hourEffective": {
|
||||
"type": "Date"
|
||||
},
|
||||
"minutesLess": {
|
||||
"type": "Date"
|
||||
},
|
||||
"etc": {
|
||||
"type": "Date"
|
||||
}
|
||||
|
||||
},
|
||||
"relations": {
|
||||
"zone": {
|
||||
"type": "belongsTo",
|
||||
"model": "Zone",
|
||||
"foreignKey": "zoneFk"
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue