2118 - Create new intrastat
gitea/salix/2113-item_data_add_instrastat There was a failure building this commit Details

This commit is contained in:
Joan Sanchez 2020-02-17 12:47:03 +01:00
parent d9ed7cda38
commit 844b27acb9
14 changed files with 201 additions and 25 deletions

View File

@ -0,0 +1,2 @@
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES ('Intrastat', '*', '*', 'ALLOW', 'ROLE', 'buyer');

View File

@ -0,0 +1,23 @@
ALTER TABLE `vn`.`taxClassCode`
DROP FOREIGN KEY `taxClassCode_ibfk_2`,
DROP FOREIGN KEY `taxClassCode_ibfk_1`;
ALTER TABLE `vn`.`taxClassCode`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`),
DROP INDEX `iva_codigo_id` ;
ALTER TABLE `vn`.`taxClassCode`
ADD UNIQUE INDEX `taxClassCode_unique` (`taxClassFk` ASC, `effectived` ASC, `taxCodeFk` ASC) VISIBLE;
ALTER TABLE `vn`.`taxClassCode`
ADD CONSTRAINT `taxClassCode_taxClassFk`
FOREIGN KEY (`taxClassFk`)
REFERENCES `vn`.`taxClass` (`id`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
ADD CONSTRAINT `taxClassCode_taxCodeFk`
FOREIGN KEY (`taxCodeFk`)
REFERENCES `vn`.`taxCode` (`id`)
ON DELETE RESTRICT
ON UPDATE CASCADE;

View File

@ -684,9 +684,15 @@ INSERT INTO `vn`.`taxCode`(`id`, `dated`, `code`, `taxTypeFk`, `rate`, `equaliza
INSERT INTO `vn`.`taxClass`(`id`, `description`, `code`) INSERT INTO `vn`.`taxClass`(`id`, `description`, `code`)
VALUES VALUES
(1, 'Reduced VAT','R'), (1, 'Reduced VAT', 'R'),
(2, 'General VAT', 'G'); (2, 'General VAT', 'G');
INSERT INTO `vn`.`taxClassCode`(`id`, `taxClassFk`, `effectived`, `taxCodeFk`)
VALUES
(1, 1, CURDATE(), 1),
(2, 1, CURDATE(), 21),
(3, 2, CURDATE(), 2);
INSERT INTO `vn`.`intrastat`(`id`, `description`, `taxClassFk`, `taxCodeFk`) INSERT INTO `vn`.`intrastat`(`id`, `description`, `taxClassFk`, `taxCodeFk`)
VALUES VALUES
(05080000, 'Coral y materiales similares', 2, 2), (05080000, 'Coral y materiales similares', 2, 2),

View File

@ -262,6 +262,10 @@ export default {
longName: 'vn-textfield[ng-model="$ctrl.item.longName"]', longName: 'vn-textfield[ng-model="$ctrl.item.longName"]',
isActiveCheckbox: 'vn-check[label="Active"]', isActiveCheckbox: 'vn-check[label="Active"]',
priceInKgCheckbox: 'vn-check[label="Price in kg"]', priceInKgCheckbox: 'vn-check[label="Price in kg"]',
newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button',
newIntrastatId: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.newIntrastat.intrastatId"]',
newIntrastatDescription: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.newIntrastat.description"]',
acceptIntrastatButton: '.vn-dialog.shown button[response="accept"]',
submitBasicDataButton: `button[type=submit]` submitBasicDataButton: `button[type=submit]`
}, },
itemTags: { itemTags: {

View File

@ -39,6 +39,26 @@ describe('Item Edit basic data path', () => {
expect(result).toEqual('Data saved!'); expect(result).toEqual('Data saved!');
}, 20000); }, 20000);
it(`should create a new intrastat`, async() => {
await page.waitToClick(selectors.itemBasicData.newIntrastatButton);
await page.write(selectors.itemBasicData.newIntrastatId, '588420239');
await page.write(selectors.itemBasicData.newIntrastatDescription, 'Tropical Flowers');
await page.waitToClick(selectors.itemBasicData.acceptIntrastatButton);
await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers');
let newcode = await page.waitToGetProperty(selectors.itemBasicData.intrastat, 'value');
expect(newcode).toEqual('588420239 Tropical Flowers');
});
it(`should save with the new intrastat`, async() => {
await page.waitFor(250);
await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers');
await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
const result = await page.waitForLastSnackbar();
expect(result).toEqual('Data saved!');
});
it(`should confirm the item name was edited`, async() => { it(`should confirm the item name was edited`, async() => {
await page.reloadSection('item.card.basicData'); await page.reloadSection('item.card.basicData');
const result = await page.waitToGetProperty(selectors.itemBasicData.name, 'value'); const result = await page.waitToGetProperty(selectors.itemBasicData.name, 'value');
@ -53,11 +73,11 @@ describe('Item Edit basic data path', () => {
expect(result).toEqual('Anthurium'); expect(result).toEqual('Anthurium');
}); });
it(`should confirm the item intrastad was edited`, async() => { it(`should confirm the item intrastat was edited`, async() => {
const result = await page const result = await page
.waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); .waitToGetProperty(selectors.itemBasicData.intrastat, 'value');
expect(result).toEqual('5080000 Coral y materiales similares'); expect(result).toEqual('588420239 Tropical Flowers');
}); });
it(`should confirm the item relevancy was edited`, async() => { it(`should confirm the item relevancy was edited`, async() => {

View File

@ -0,0 +1,61 @@
let UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethod('createIntrastat', {
description: 'Creates a new item intrastat',
accessType: 'WRITE',
accepts: [{
arg: 'id',
type: 'number',
required: true,
description: 'The item id',
http: {source: 'path'}
},
{
arg: 'intrastatId',
type: 'number',
required: true
},
{
arg: 'description',
type: 'string',
required: true
}],
returns: {
type: 'boolean',
root: true
},
http: {
path: `/:id/createIntrastat`,
verb: 'PATCH'
}
});
Self.createIntrastat = async(id, intrastatId, description) => {
const models = Self.app.models;
const country = await models.Country.findOne({
where: {code: 'ES'}
});
const itemTaxCountry = await models.ItemTaxCountry.findOne({
where: {
itemFk: id,
countryFk: country.id
},
order: 'effectived DESC'
});
const taxClassCode = await models.TaxClassCode.findOne({
where: {
taxClassFk: itemTaxCountry.taxClassFk
},
order: 'effectived DESC'
});
return models.Intrastat.create({
id: intrastatId,
description: description,
taxClassFk: itemTaxCountry.taxClassFk,
taxCodeFk: taxClassCode.taxCodeFk
});
};
};

View File

@ -55,9 +55,6 @@ module.exports = Self => {
} }
}] }]
} }
},
{
relation: 'taxClass'
} }
] ]
}; };

View File

@ -0,0 +1,22 @@
const app = require('vn-loopback/server/server');
describe('createIntrastat()', () => {
let newIntrastat;
afterAll(async done => {
await app.models.Intrastat.destroyById(newIntrastat.id);
done();
});
it('should create a new intrastat', async() => {
const intrastatId = 588420239;
const description = 'Tropical Flowers';
const itemId = 9;
newIntrastat = await app.models.Item.createIntrastat(itemId, intrastatId, description);
expect(newIntrastat.description).toEqual(description);
expect(newIntrastat.taxClassFk).toEqual(1);
expect(newIntrastat.taxCodeFk).toEqual(21);
});
});

View File

@ -62,6 +62,9 @@
"TaxClass": { "TaxClass": {
"dataSource": "vn" "dataSource": "vn"
}, },
"TaxClassCode": {
"dataSource": "vn"
},
"TaxCode": { "TaxCode": {
"dataSource": "vn" "dataSource": "vn"
}, },

View File

@ -12,6 +12,7 @@ module.exports = Self => {
require('../methods/item/getVisibleAvailable')(Self); require('../methods/item/getVisibleAvailable')(Self);
require('../methods/item/new')(Self); require('../methods/item/new')(Self);
require('../methods/item/getWasteDetail')(Self); require('../methods/item/getWasteDetail')(Self);
require('../methods/item/createIntrastat')(Self);
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'}); Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});

View File

@ -0,0 +1,47 @@
{
"name": "TaxClassCode",
"base": "VnModel",
"options": {
"mysql": {
"table": "taxClassCode"
}
},
"properties": {
"id": {
"type": "number",
"id": true
},
"effectived": {
"type": "date",
"required": true
},
"taxClassFk": {
"type": "number",
"required": true
},
"taxCodeFk": {
"type": "number",
"required": true
}
},
"relations": {
"taxClass": {
"type": "belongsTo",
"model": "TaxClass",
"foreignKey": "taxClassFk"
},
"taxCode": {
"type": "belongsTo",
"model": "TaxCode",
"foreignKey": "taxCodeFk"
}
},
"acls": [
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
}
]
}

View File

@ -1,3 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`vnItemBasicData Component vnItemBasicData $onChanges() should pass the data to the watcher 1`] = `"the current value of an item"`;

View File

@ -149,27 +149,19 @@
<tpl-body> <tpl-body>
<h5 class="vn-py-sm" translate>New intrastat</h5> <h5 class="vn-py-sm" translate>New intrastat</h5>
<vn-horizontal> <vn-horizontal>
<vn-textfield vn-one vn-focus <vn-input-number vn-one vn-focus
label="Identifier" label="Identifier"
ng-model="$ctrl.newIntrastat.id" ng-model="$ctrl.newIntrastat.intrastatId"
required="true"> required="true">
</vn-textfield> </vn-input-number>
</vn-horizontal>
<vn-horizontal>
<vn-textfield vn-one <vn-textfield vn-one
label="Description" label="Description"
ng-model="$ctrl.newIntrastat.description" ng-model="$ctrl.newIntrastat.description"
required="true"> required="true">
</vn-textfield> </vn-textfield>
</vn-horizontal> </vn-horizontal>
<vn-horizontal>
<vn-autocomplete vn-one
url="TaxClasses"
label="Tax class"
show-field="description"
value-field="id"
ng-model="$ctrl.newIntrastat.taxClassFk"
initial-data="$ctrl.item.taxClass">
</vn-autocomplete>
</vn-horizontal>
</tpl-body> </tpl-body>
<tpl-buttons> <tpl-buttons>
<input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/> <input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/>

View File

@ -11,9 +11,10 @@ class Controller extends Component {
this.$.intrastat.show(); this.$.intrastat.show();
} }
onCustomAgentAccept() { onIntrastatAccept() {
return this.$http.post(`CustomsAgents`, this.newCustomsAgent) const query = `Items/${this.$params.id}/createIntrastat`;
.then(res => this.address.customsAgentFk = res.data.id); return this.$http.patch(query, this.newIntrastat)
.then(res => this.item.intrastatFk = res.data.id);
} }
} }