#794 item.regularize
This commit is contained in:
parent
2820b29ba0
commit
e55971a21a
|
@ -3,10 +3,19 @@
|
||||||
<a translate-attr="{title: 'Return to module index'}" ui-sref="item.index">
|
<a translate-attr="{title: 'Return to module index'}" ui-sref="item.index">
|
||||||
<vn-icon icon="chevron_left"></vn-icon>
|
<vn-icon icon="chevron_left"></vn-icon>
|
||||||
</a>
|
</a>
|
||||||
<vn-icon icon="inbox"></vn-icon>
|
|
||||||
<a translate-attr="{title: 'Preview'}" ui-sref="item.card.summary({id: $ctrl.item.id})">
|
<a translate-attr="{title: 'Preview'}" ui-sref="item.card.summary({id: $ctrl.item.id})">
|
||||||
<vn-icon icon="desktop_windows"></vn-icon>
|
<vn-icon icon="desktop_windows"></vn-icon>
|
||||||
</a>
|
</a>
|
||||||
|
<vn-icon-menu
|
||||||
|
vn-id="more-button"
|
||||||
|
icon="more_vert"
|
||||||
|
show-filter="false"
|
||||||
|
value-field="callback"
|
||||||
|
translate-fields="['name']"
|
||||||
|
data="$ctrl.moreOptions"
|
||||||
|
on-change="$ctrl.onMoreChange(value)"
|
||||||
|
on-open="$ctrl.onMoreOpen()">
|
||||||
|
</vn-icon-menu>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-vertical>
|
<vn-vertical>
|
||||||
<vn-auto style="position: relative" text-center>
|
<vn-auto style="position: relative" text-center>
|
||||||
|
@ -75,3 +84,37 @@
|
||||||
</a>
|
</a>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
|
||||||
|
<vn-dialog
|
||||||
|
vn-id="regularize"
|
||||||
|
on-open="$ctrl.clearRegularizeDialog()"
|
||||||
|
on-response="$ctrl.saveRegularize(response)">
|
||||||
|
<tpl-body>
|
||||||
|
<div>
|
||||||
|
<h5 style="text-align: center">
|
||||||
|
<span translate>Regularize</span>
|
||||||
|
</h5>
|
||||||
|
<vn-textfield
|
||||||
|
label="Quantity"
|
||||||
|
model="$ctrl.quantity"
|
||||||
|
name="user"
|
||||||
|
vn-id="userField"
|
||||||
|
vn-focus>
|
||||||
|
</vn-textfield>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
label="Warehouse"
|
||||||
|
id="warehouse"
|
||||||
|
field="$ctrl.warehouseFk"
|
||||||
|
url="/api/Warehouses"
|
||||||
|
select-fields="['id', 'name']"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</div>
|
||||||
|
</tpl-body>
|
||||||
|
<tpl-buttons>
|
||||||
|
<input type="button" response="CANCEL" translate-attr="{value: 'Cancel'}"/>
|
||||||
|
<button response="ACCEPT" translate>Save</button>
|
||||||
|
</tpl-buttons>
|
||||||
|
</vn-dialog>
|
|
@ -2,8 +2,42 @@ import ngModule from '../module';
|
||||||
import './style.scss';
|
import './style.scss';
|
||||||
|
|
||||||
class Controller {
|
class Controller {
|
||||||
constructor($state) {
|
constructor($state, $scope, $http, vnApp, $translate) {
|
||||||
this.$state = $state;
|
this.$state = $state;
|
||||||
|
this.$scope = $scope;
|
||||||
|
this.$http = $http;
|
||||||
|
this.vnApp = vnApp;
|
||||||
|
this.$translate = $translate;
|
||||||
|
this.moreOptions = [
|
||||||
|
{callback: this.showRegularizeDialog, name: 'Regularize'}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
set quantity(value) {
|
||||||
|
this._quantity = parseInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
get quantity() {
|
||||||
|
return this._quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
set warehouseFk(value) {
|
||||||
|
this._warehouseFk = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
get warehouseFk() {
|
||||||
|
if (!this._warehouseFk)
|
||||||
|
this._warehouseFk = parseInt(window.localStorage.localWarehouseFk);
|
||||||
|
|
||||||
|
return this._warehouseFk;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMoreChange(callback) {
|
||||||
|
callback.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
showRegularizeDialog() {
|
||||||
|
this.$scope.regularize.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
set quicklinks(value = {}) {
|
set quicklinks(value = {}) {
|
||||||
|
@ -13,9 +47,26 @@ class Controller {
|
||||||
get quicklinks() {
|
get quicklinks() {
|
||||||
return this._quicklinks;
|
return this._quicklinks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
saveRegularize(response) {
|
||||||
|
if (response == 'ACCEPT') {
|
||||||
|
this.$http.post(`/item/api/Items/regularize`, {
|
||||||
|
itemFk: this.item.id,
|
||||||
|
quantity: this.quantity,
|
||||||
|
warehouseFk: this.warehouseFk
|
||||||
|
}).then(res => {
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clearRegularizeDialog() {
|
||||||
|
this.warehouseFk = null;
|
||||||
|
this.quantity = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$state'];
|
Controller.$inject = ['$state', '$scope', '$http', 'vnApp', '$translate'];
|
||||||
|
|
||||||
ngModule.component('vnItemDescriptor', {
|
ngModule.component('vnItemDescriptor', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Regularize: Regularizar
|
|
@ -6,4 +6,9 @@ vn-item-descriptor {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
vn-dialog[vn-id=regularize]{
|
||||||
|
vn-textfield{
|
||||||
|
width: 100%
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,6 @@
|
||||||
"ClaimRedelivery": {
|
"ClaimRedelivery": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
"ClaimDestination": {
|
|
||||||
"dataSource": "vn"
|
|
||||||
},
|
|
||||||
"ClaimResponsible": {
|
"ClaimResponsible": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('regularize', {
|
||||||
|
description: 'Sends items to the trash',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'itemFk',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The item id',
|
||||||
|
}, {
|
||||||
|
arg: 'quantity',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The visible quantity',
|
||||||
|
}, {
|
||||||
|
arg: 'warehouseFk',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The id of the wharehouse where the inventory happened',
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: 'boolean',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/regularize`,
|
||||||
|
verb: 'post'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.regularize = async (ctx, itemFk, quantity, warehouseFk) => {
|
||||||
|
const userId = ctx.req.accessToken.userId;
|
||||||
|
const models = Self.app.models;
|
||||||
|
|
||||||
|
const itemDestination = await models.ClaimDestination.findOne({
|
||||||
|
include: {
|
||||||
|
relation: 'address',
|
||||||
|
scope: {
|
||||||
|
fields: ['clientFk']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
where: {description: 'Corregido'}
|
||||||
|
});
|
||||||
|
|
||||||
|
let transaction = await Self.beginTransaction({});
|
||||||
|
try {
|
||||||
|
let item = await models.Item.findById(itemFk);
|
||||||
|
|
||||||
|
let ticketFk = await getTicketId({
|
||||||
|
clientFk: itemDestination.address.clientFk,
|
||||||
|
addressFk: itemDestination.addressFk,
|
||||||
|
warehouseFk: warehouseFk
|
||||||
|
}, transaction);
|
||||||
|
|
||||||
|
if (!ticketFk) {
|
||||||
|
ticketFk = await createTicket({
|
||||||
|
clientFk: itemDestination.address().clientFk,
|
||||||
|
addressFk: itemDestination.addressFk,
|
||||||
|
warehouseFk: warehouseFk,
|
||||||
|
userId: userId
|
||||||
|
}, transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let query = `
|
||||||
|
CALL vn.getItemVisibleAvailable(?,curdate(),?,?)`;
|
||||||
|
|
||||||
|
let options = [itemFk, warehouseFk, true];
|
||||||
|
let [res] = await Self.rawSql(query, options, {transaction: transaction});
|
||||||
|
|
||||||
|
let newQuantity = res[0].visible - quantity;
|
||||||
|
|
||||||
|
await models.Sale.create({
|
||||||
|
ticketFk: ticketFk,
|
||||||
|
itemFk: itemFk,
|
||||||
|
concept: item.name,
|
||||||
|
quantity: newQuantity,
|
||||||
|
discount: 100
|
||||||
|
}, {transaction: transaction});
|
||||||
|
|
||||||
|
await transaction.commit();
|
||||||
|
return ticketFk;
|
||||||
|
} catch (e) {
|
||||||
|
await transaction.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createTicket(params, transaction) {
|
||||||
|
let ticket = await Self.app.models.Ticket.new({
|
||||||
|
shipped: new Date(),
|
||||||
|
landed: new Date(),
|
||||||
|
clientFk: params.clientFk,
|
||||||
|
warehouseFk: params.warehouseFk,
|
||||||
|
companyFk: params.companyFk,
|
||||||
|
addressFk: params.addressFk,
|
||||||
|
userId: params.userId
|
||||||
|
}, {transaction: transaction});
|
||||||
|
|
||||||
|
return ticket.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function getTicketId(params, transaction) {
|
||||||
|
const currentDate = new Date();
|
||||||
|
currentDate.setHours(null, null, null);
|
||||||
|
|
||||||
|
let ticket = await Self.app.models.Ticket.findOne({
|
||||||
|
where: {
|
||||||
|
addressFk: params.addressFk,
|
||||||
|
warehouseFk: params.warehouseFk,
|
||||||
|
shipped: currentDate,
|
||||||
|
landed: currentDate
|
||||||
|
}
|
||||||
|
}, {transaction: transaction});
|
||||||
|
|
||||||
|
return ticket && ticket.id;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,33 @@
|
||||||
|
const app = require(`${servicesDir}/item/server/server`);
|
||||||
|
|
||||||
|
describe('regularize()', () => {
|
||||||
|
const itemFk = 1;
|
||||||
|
const warehouseFk = 1;
|
||||||
|
const trashAddress = 11;
|
||||||
|
let trashTicket;
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await app.models.Ticket.destroyById(trashTicket.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create a new ticket and add a line', async () => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 18}}};
|
||||||
|
|
||||||
|
|
||||||
|
let query = `CALL vn.getItemVisibleAvailable(?,curdate(),?,?)`;
|
||||||
|
|
||||||
|
let options = [itemFk, warehouseFk, true];
|
||||||
|
|
||||||
|
let [res] = await app.models.Item.rawSql(query, options);
|
||||||
|
let visible = res[0].visible;
|
||||||
|
let saleQuantity = visible - 11;
|
||||||
|
|
||||||
|
let ticketFk = await app.models.Item.regularize(ctx, itemFk, 11, warehouseFk);
|
||||||
|
let sale = await app.models.Sale.findOne({where: {ticketFk: ticketFk}});
|
||||||
|
trashTicket = await app.models.Ticket.findById(ticketFk);
|
||||||
|
|
||||||
|
expect(sale.quantity).toEqual(saleQuantity);
|
||||||
|
expect(sale.discount).toEqual(100);
|
||||||
|
expect(trashTicket.addressFk).toEqual(trashAddress);
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,4 +1,4 @@
|
||||||
const ParameterizedSQL = require('vn-loopback/node_modules/loopback-connector').ParameterizedSQL;
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('catalogFilter', {
|
Self.remoteMethod('catalogFilter', {
|
||||||
|
@ -61,19 +61,20 @@ module.exports = Self => {
|
||||||
for (const tag of tags) {
|
for (const tag of tags) {
|
||||||
const tAlias = `it${i++}`;
|
const tAlias = `it${i++}`;
|
||||||
|
|
||||||
if (tag.tagFk)
|
if (tag.tagFk) {
|
||||||
stmt.merge({
|
stmt.merge({
|
||||||
sql: `JOIN vn.itemTag ${tAlias} ON ${tAlias}.itemFk = i.id
|
sql: `JOIN vn.itemTag ${tAlias} ON ${tAlias}.itemFk = i.id
|
||||||
AND ${tAlias}.tagFk = ?
|
AND ${tAlias}.tagFk = ?
|
||||||
AND ${tAlias}.value LIKE ?`,
|
AND ${tAlias}.value LIKE ?`,
|
||||||
params: [tag.tagFk, `%${tag.value}%`],
|
params: [tag.tagFk, `%${tag.value}%`],
|
||||||
});
|
});
|
||||||
else
|
} else {
|
||||||
stmt.merge({
|
stmt.merge({
|
||||||
sql: `JOIN vn.itemTag ${tAlias} ON ${tAlias}.itemFk = i.id
|
sql: `JOIN vn.itemTag ${tAlias} ON ${tAlias}.itemFk = i.id
|
||||||
AND ${tAlias}.value LIKE ?`,
|
AND ${tAlias}.value LIKE ?`,
|
||||||
params: [`%${tag.value}%`],
|
params: [`%${tag.value}%`],
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const UserError = require('vn-loopback/common/helpers').UserError;
|
let UserError = require('../../helpers').UserError;
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('new', {
|
Self.remoteMethod('new', {
|
||||||
|
@ -22,7 +22,7 @@ module.exports = Self => {
|
||||||
Self.new = async params => {
|
Self.new = async params => {
|
||||||
let address = await Self.app.models.Address.findOne({
|
let address = await Self.app.models.Address.findOne({
|
||||||
where: {id: params.addressFk},
|
where: {id: params.addressFk},
|
||||||
fields: 'clientFk'
|
fields: ['clientFk']
|
||||||
});
|
});
|
||||||
let clientFk = address.clientFk;
|
let clientFk = address.clientFk;
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ module.exports = Self => {
|
||||||
params.landed,
|
params.landed,
|
||||||
params.agencyModeFk,
|
params.agencyModeFk,
|
||||||
params.addressFk,
|
params.addressFk,
|
||||||
"SALIX"
|
'SALIX'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return result[0].vOrderId;
|
return result[0].vOrderId;
|
|
@ -0,0 +1,34 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('newFromTicket', {
|
||||||
|
description: 'Create a new order and returns the new ID',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'ticketFk',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The ticket id',
|
||||||
|
required: true
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: 'number',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/newFromTicket`,
|
||||||
|
verb: 'post'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.newFromTicket = async ticketFk => {
|
||||||
|
let ticket = await Self.app.models.Ticket.findOne({
|
||||||
|
where: {id: ticketFk}
|
||||||
|
});
|
||||||
|
|
||||||
|
let orderID = await Self.app.models.Order.new({
|
||||||
|
addressFk: ticket.addressFk,
|
||||||
|
landed: ticket.landed,
|
||||||
|
agencyModeFk: ticket.agencyModeFk
|
||||||
|
});
|
||||||
|
|
||||||
|
return orderID;
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,62 +1,62 @@
|
||||||
const app = require(`${servicesDir}/order/server/server`);
|
const app = require(`${servicesDir}/order/server/server`);
|
||||||
const UserError = require('vn-loopback/common/helpers').UserError;
|
let UserError = require('../../../helpers').UserError;
|
||||||
|
|
||||||
describe('order new()', () => {
|
describe('order new()', () => {
|
||||||
let orderId;
|
let orderId;
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async () => {
|
||||||
await app.models.Order.destroyById(orderId);
|
await app.models.Order.destroyById(orderId);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the client is frozen', async() => {
|
it('should throw an error if the client is frozen', async () => {
|
||||||
let error;
|
let error;
|
||||||
let params = {addressFk: 121};
|
let params = {addressFk: 121};
|
||||||
|
|
||||||
await app.models.Order.new(params)
|
await app.models.Order.new(params)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(error).toEqual(new UserError(`You can't create an order for a frozen client`));
|
expect(error).toEqual(new UserError(`You can't create an order for a frozen client`));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the client isnt frozen and isnt active', async() => {
|
it('should throw an error if the client isnt frozen and isnt active', async () => {
|
||||||
let error;
|
let error;
|
||||||
let params = {addressFk: 6};
|
let params = {addressFk: 6};
|
||||||
|
|
||||||
await app.models.Order.new(params)
|
await app.models.Order.new(params)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(error).toEqual(new UserError(`You can't create an order for a inactive client`));
|
expect(error).toEqual(new UserError(`You can't create an order for a inactive client`));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the client isnt frozen and is active but doesnt have data checked', async() => {
|
it('should throw an error if the client isnt frozen and is active but doesnt have data checked', async () => {
|
||||||
let error;
|
let error;
|
||||||
let params = {addressFk: 7};
|
let params = {addressFk: 7};
|
||||||
|
|
||||||
await app.models.Order.new(params)
|
await app.models.Order.new(params)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(error).toEqual(new UserError(`You can't create an order for a client that doesn't has tax data verified`));
|
expect(error).toEqual(new UserError(`You can't create an order for a client that doesn't has tax data verified`));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the client isnt frozen and is active, has data checked but has a debt', async() => {
|
it('should throw an error if the client isnt frozen and is active, has data checked but has a debt', async () => {
|
||||||
let error;
|
let error;
|
||||||
let params = {addressFk: 123};
|
let params = {addressFk: 123};
|
||||||
|
|
||||||
await app.models.Order.new(params)
|
await app.models.Order.new(params)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(error).toEqual(new UserError(`You can't create an order for a client that has a debt`));
|
expect(error).toEqual(new UserError(`You can't create an order for a client that has a debt`));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new order for the user with id 105 when all conditions are met', async() => {
|
it('should create a new order for the user with id 105 when all conditions are met', async () => {
|
||||||
let params = {
|
let params = {
|
||||||
landed: new Date(),
|
landed: new Date(),
|
||||||
agencyModeFk: 1,
|
agencyModeFk: 1,
|
|
@ -8,6 +8,7 @@ module.exports = Self => {
|
||||||
require('../methods/item/getLastEntries')(Self);
|
require('../methods/item/getLastEntries')(Self);
|
||||||
require('../methods/item/getSummary')(Self);
|
require('../methods/item/getSummary')(Self);
|
||||||
require('../methods/item/getCard')(Self);
|
require('../methods/item/getCard')(Self);
|
||||||
|
require('../methods/item/regularize')(Self);
|
||||||
|
|
||||||
Self.validatesPresenceOf('name', {message: 'Cannot be blank'});
|
Self.validatesPresenceOf('name', {message: 'Cannot be blank'});
|
||||||
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});
|
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});
|
||||||
|
|
|
@ -9,4 +9,5 @@ module.exports = Self => {
|
||||||
require('../methods/order/summary')(Self);
|
require('../methods/order/summary')(Self);
|
||||||
require('../methods/order/getVAT')(Self);
|
require('../methods/order/getVAT')(Self);
|
||||||
require('../methods/order/getSourceValues')(Self);
|
require('../methods/order/getSourceValues')(Self);
|
||||||
|
require('../methods/order/newFromTicket')(Self);
|
||||||
};
|
};
|
|
@ -152,5 +152,14 @@
|
||||||
},
|
},
|
||||||
"TicketRequest": {
|
"TicketRequest": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
|
"TicketLog": {
|
||||||
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
|
"ClaimDestination": {
|
||||||
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
|
"Order": {
|
||||||
|
"dataSource": "hedera"
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue