3605-invoiceIn_intrastat3 #921
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT INTO `salix`.`ACL`
|
||||||
|
(`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
||||||
|
VALUES('InvoiceInIntrastat', '*', '*', 'ALLOW', 'ROLE', 'employee');
|
|
@ -0,0 +1,2 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalType`,`principalId`)
|
||||||
|
VALUES ('InvoiceInIntrastat','*','*','ALLOW','ROLE','employee');
|
|
@ -2428,6 +2428,13 @@ INSERT INTO `vn`.`invoiceInTax` (`invoiceInFk`, `taxableBase`, `expenceFk`, `for
|
||||||
(6, 29.95, '7001000000', NULL, 7, 20),
|
(6, 29.95, '7001000000', NULL, 7, 20),
|
||||||
(7, 58.64, '6210000567', NULL, 8, 20);
|
(7, 58.64, '6210000567', NULL, 8, 20);
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`invoiceInIntrastat` (`invoiceInFk`, `net`, `intrastatFk`, `amount`, `stems`, `countryFk`)
|
||||||
|
VALUES
|
||||||
|
(1, 30.50, 5080000, 10.00, 162, 5),
|
||||||
|
(1, 10, 6021010, 20.00, 205, 5),
|
||||||
|
(2, 13.20, 5080000, 15.00, 580, 5),
|
||||||
|
(2, 16.10, 6021010, 25.00, 80, 5);
|
||||||
|
|
||||||
INSERT INTO `vn`.`ticketRecalc`(`ticketFk`)
|
INSERT INTO `vn`.`ticketRecalc`(`ticketFk`)
|
||||||
SELECT `id`
|
SELECT `id`
|
||||||
FROM `vn`.`ticket` t
|
FROM `vn`.`ticket` t
|
||||||
|
|
|
@ -64,6 +64,34 @@ module.exports = Self => {
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
relation: 'invoiceInIntrastat',
|
||||||
|
scope: {
|
||||||
|
fields: [
|
||||||
|
'id',
|
||||||
|
'invoiceInFk',
|
||||||
|
'net',
|
||||||
|
'intrastatFk',
|
||||||
|
'amount',
|
||||||
|
'stems',
|
||||||
|
'countryFk',
|
||||||
|
'statisticalValue'],
|
||||||
|
include: [{
|
||||||
|
relation: 'intrastat',
|
||||||
|
scope: {
|
||||||
|
fields: [
|
||||||
|
'id',
|
||||||
|
'description']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
relation: 'country',
|
||||||
|
scope: {
|
||||||
|
fields: ['code']
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
relation: 'invoiceInTax',
|
relation: 'invoiceInTax',
|
||||||
scope: {
|
scope: {
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
"InvoiceInDueDay": {
|
"InvoiceInDueDay": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
"InvoiceInIntrastat": {
|
||||||
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
"InvoiceInLog": {
|
"InvoiceInLog": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
{
|
||||||
|
"name": "InvoiceInIntrastat",
|
||||||
|
"base": "VnModel",
|
||||||
|
"options": {
|
||||||
|
"mysql": {
|
||||||
|
"table": "invoiceInIntrastat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"id": true,
|
||||||
|
"type": "number",
|
||||||
|
"description": "Identifier"
|
||||||
|
},
|
||||||
|
"invoiceInFk": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"net": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"intrastatFk": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"amount": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"stems": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"countryFk": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"statisticalValue": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"relations": {
|
||||||
|
"intrastat": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Intrastat",
|
||||||
|
"foreignKey": "intrastatFk"
|
||||||
|
},
|
||||||
|
"country": {
|
||||||
|
"type": "belongsTo",
|
||||||
|
"model": "Country",
|
||||||
|
"foreignKey": "countryFk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -64,6 +64,11 @@
|
||||||
"model": "InvoiceInDueDay",
|
"model": "InvoiceInDueDay",
|
||||||
"foreignKey": "invoiceInFk"
|
"foreignKey": "invoiceInFk"
|
||||||
},
|
},
|
||||||
|
"invoiceInIntrastat": {
|
||||||
|
"type": "hasMany",
|
||||||
|
"model": "InvoiceInIntrastat",
|
||||||
|
"foreignKey": "invoiceInFk"
|
||||||
|
},
|
||||||
"invoiceInTax": {
|
"invoiceInTax": {
|
||||||
"type": "hasMany",
|
"type": "hasMany",
|
||||||
"model": "InvoiceInTax",
|
"model": "InvoiceInTax",
|
||||||
|
|
|
@ -10,5 +10,6 @@ import './summary';
|
||||||
import './basic-data';
|
import './basic-data';
|
||||||
import './tax';
|
import './tax';
|
||||||
import './dueDay';
|
import './dueDay';
|
||||||
|
import './intrastat';
|
||||||
import './create';
|
import './create';
|
||||||
import './log';
|
import './log';
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
<vn-crud-model
|
||||||
|
vn-id="model"
|
||||||
|
url="InvoiceInIntrastats"
|
||||||
|
data="$ctrl.invoceInIntrastat"
|
||||||
|
link="{invoiceInFk: $ctrl.$params.id}"
|
||||||
|
auto-load="true"
|
||||||
|
on-data-change="$ctrl.calculateTotals()">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Countries"
|
||||||
|
data="countries"
|
||||||
|
order="country">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Intrastats"
|
||||||
|
data="intrastats"
|
||||||
|
order="id">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-watcher
|
||||||
|
vn-id="watcher"
|
||||||
|
data="$ctrl.invoceInIntrastat"
|
||||||
|
form="form">
|
||||||
|
</vn-watcher>
|
||||||
|
<vn-card
|
||||||
|
class="vn-mb-md vn-pa-lg vn-w-lg"
|
||||||
|
style="text-align: right"
|
||||||
|
ng-if="$ctrl.invoceInIntrastat.length > 0">
|
||||||
|
<vn-label-value label="Total amount"
|
||||||
|
value="{{$ctrl.amountTotal | currency: 'EUR':2}}">
|
||||||
|
</vn-label-value>
|
||||||
|
<vn-label-value label="Total net"
|
||||||
|
value="{{$ctrl.netTotal}}">
|
||||||
|
</vn-label-value>
|
||||||
|
<vn-label-value label="Total stems"
|
||||||
|
value="{{$ctrl.stemsTotal}}">
|
||||||
|
</vn-label-value>
|
||||||
|
</vn-card>
|
||||||
|
<form name="form" ng-submit="$ctrl.onSubmit()">
|
||||||
|
<vn-card class="vn-pa-lg">
|
||||||
|
<vn-horizontal ng-repeat="intrastat in $ctrl.invoceInIntrastat">
|
||||||
|
<vn-autocomplete vn-three
|
||||||
|
label="Code"
|
||||||
|
data="intrastats"
|
||||||
|
ng-model="intrastat.intrastatFk"
|
||||||
|
show-field="description"
|
||||||
|
rule
|
||||||
|
vn-focus>
|
||||||
|
<tpl-item>{{id | zeroFill:8}}: {{description}}</tpl-item>
|
||||||
|
</vn-autocomplete>
|
||||||
|
<vn-input-number
|
||||||
|
label="Amount"
|
||||||
|
ng-model="intrastat.amount"
|
||||||
|
step="0.01"
|
||||||
|
rule>
|
||||||
vicent marked this conversation as resolved
Outdated
|
|||||||
|
</vn-input-number>
|
||||||
|
<vn-input-number
|
||||||
|
label="Net"
|
||||||
|
ng-model="intrastat.net"
|
||||||
|
step="0.01"
|
||||||
|
rule>
|
||||||
|
</vn-input-number>
|
||||||
|
<vn-input-number
|
||||||
|
label="Stems"
|
||||||
|
ng-model="intrastat.stems"
|
||||||
|
rule>
|
||||||
|
</vn-input-number>
|
||||||
|
<vn-autocomplete
|
||||||
|
label="Country"
|
||||||
|
data="countries"
|
||||||
|
ng-model="intrastat.countryFk"
|
||||||
|
show-field="code"
|
||||||
|
rule>
|
||||||
|
</vn-autocomplete>
|
||||||
|
<vn-none>
|
||||||
|
<vn-icon-button
|
||||||
|
vn-tooltip="Remove due day"
|
||||||
|
icon="delete"
|
||||||
|
ng-click="$ctrl.deleteIntrastat($index)"
|
||||||
|
tabindex="-1">
|
||||||
|
</vn-icon-button>
|
||||||
|
</vn-none>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-one>
|
||||||
|
<vn-icon-button
|
||||||
|
vn-bind="+"
|
||||||
|
vn-tooltip="Add due day"
|
||||||
|
icon="add_circle"
|
||||||
|
ng-click="$ctrl.add()">
|
||||||
|
</vn-icon-button>
|
||||||
|
</vn-one>
|
||||||
|
</vn-card>
|
||||||
|
<vn-button-bar>
|
||||||
|
<vn-submit
|
||||||
|
disabled="!watcher.dataChanged()"
|
||||||
|
label="Save">
|
||||||
|
</vn-submit>
|
||||||
|
</vn-button-bar>
|
||||||
|
</form>
|
|
@ -0,0 +1,60 @@
|
||||||
|
import ngModule from '../module';
|
||||||
|
import Section from 'salix/components/section';
|
||||||
|
|
||||||
|
class Controller extends Section {
|
||||||
|
set invoceInIntrastat(value) {
|
||||||
|
this._invoceInIntrastat = value;
|
||||||
|
|
||||||
|
if (value) this.calculateTotals();
|
||||||
|
}
|
||||||
|
|
||||||
|
get invoceInIntrastat() {
|
||||||
|
return this._invoceInIntrastat;
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateTotals() {
|
||||||
|
this.amountTotal = 0.0;
|
||||||
|
this.netTotal = 0.0;
|
||||||
|
this.stemsTotal = 0.0;
|
||||||
|
if (!this.invoceInIntrastat) return;
|
||||||
|
|
||||||
|
this.invoceInIntrastat.forEach(intrastat => {
|
||||||
vicent marked this conversation as resolved
Outdated
carlosjr
commented
Do not access private properties if you have getters and setters in your toolkit. Do not access private properties if you have getters and setters in your toolkit.
|
|||||||
|
this.amountTotal += intrastat.amount;
|
||||||
|
this.netTotal += intrastat.net;
|
||||||
|
this.stemsTotal += intrastat.stems;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
add() {
|
||||||
|
this.$.model.insert({});
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteIntrastat($index) {
|
||||||
|
this.$.model.remove($index);
|
||||||
|
this.$.model.save().then(() => {
|
||||||
|
this.vnApp.showSuccess(this.$t('Data saved!'));
|
||||||
|
this.calculateTotals();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onSubmit() {
|
||||||
|
this.$.watcher.check();
|
||||||
|
this.$.model.save().then(() => {
|
||||||
|
this.$.watcher.notifySaved();
|
||||||
|
this.$.watcher.updateOriginalData();
|
||||||
|
this.calculateTotals();
|
||||||
|
this.card.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngModule.vnComponent('vnInvoiceInIntrastat', {
|
||||||
|
template: require('./index.html'),
|
||||||
|
controller: Controller,
|
||||||
|
require: {
|
||||||
|
card: '^vnInvoiceInCard'
|
||||||
|
},
|
||||||
|
bindings: {
|
||||||
|
invoiceIn: '<'
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,85 @@
|
||||||
|
import './index.js';
|
||||||
|
import watcher from 'core/mocks/watcher';
|
||||||
|
import crudModel from 'core/mocks/crud-model';
|
||||||
|
|
||||||
|
describe('InvoiceIn', () => {
|
||||||
|
describe('Component intrastat', () => {
|
||||||
|
let controller;
|
||||||
|
let $scope;
|
||||||
|
let vnApp;
|
||||||
|
|
||||||
|
beforeEach(ngModule('invoiceIn'));
|
||||||
|
|
||||||
|
beforeEach(inject(($componentController, $rootScope, _vnApp_) => {
|
||||||
|
vnApp = _vnApp_;
|
||||||
|
jest.spyOn(vnApp, 'showError');
|
||||||
|
$scope = $rootScope.$new();
|
||||||
|
$scope.model = crudModel;
|
||||||
|
$scope.watcher = watcher;
|
||||||
|
|
||||||
|
const $element = angular.element('<vn-invoice-in-intrastat></vn-invoice-in-intrastat>');
|
||||||
|
controller = $componentController('vnInvoiceInIntrastat', {$element, $scope});
|
||||||
|
controller.invoiceIn = {id: 1};
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('calculateTotals()', () => {
|
||||||
|
it('should set amountTotal, netTotal and stemsTotal to 0 if salesClaimed has no data', () => {
|
||||||
vicent marked this conversation as resolved
carlosjr
commented
You missed the test where the actual purpose of the function is tested. You missed the test where the actual purpose of the function is tested.
|
|||||||
|
controller.invoceInIntrastat = [];
|
||||||
|
controller.calculateTotals();
|
||||||
|
|
||||||
|
expect(controller.amountTotal).toEqual(0);
|
||||||
|
expect(controller.netTotal).toEqual(0);
|
||||||
|
expect(controller.stemsTotal).toEqual(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set amountTotal, netTotal and stemsTotal', () => {
|
||||||
|
controller.invoceInIntrastat = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
invoiceInFk: 1,
|
||||||
|
net: 30.5,
|
||||||
|
intrastatFk: 5080000,
|
||||||
|
amount: 10,
|
||||||
|
stems: 162,
|
||||||
|
countryFk: 5,
|
||||||
|
statisticalValue: 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
invoiceInFk: 1,
|
||||||
|
net: 10,
|
||||||
|
intrastatFk: 6021010,
|
||||||
|
amount: 20,
|
||||||
|
stems: 205,
|
||||||
|
countryFk: 5,
|
||||||
|
statisticalValue: 0
|
||||||
|
}
|
||||||
|
];
|
||||||
|
controller.calculateTotals();
|
||||||
|
|
||||||
|
expect(controller.amountTotal).toEqual(30);
|
||||||
|
expect(controller.netTotal).toEqual(40.5);
|
||||||
|
expect(controller.stemsTotal).toEqual(367);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('onSubmit()', () => {
|
||||||
|
it('should make HTTP POST request to save intrastat values', () => {
|
||||||
|
controller.card = {reload: () => {}};
|
||||||
|
jest.spyOn($scope.watcher, 'check');
|
||||||
|
jest.spyOn($scope.watcher, 'notifySaved');
|
||||||
|
jest.spyOn($scope.watcher, 'updateOriginalData');
|
||||||
|
jest.spyOn(controller.card, 'reload');
|
||||||
|
jest.spyOn($scope.model, 'save');
|
||||||
|
|
||||||
|
controller.onSubmit();
|
||||||
|
|
||||||
|
expect($scope.model.save).toHaveBeenCalledWith();
|
||||||
|
expect($scope.watcher.updateOriginalData).toHaveBeenCalledWith();
|
||||||
|
expect($scope.watcher.check).toHaveBeenCalledWith();
|
||||||
|
expect($scope.watcher.notifySaved).toHaveBeenCalledWith();
|
||||||
|
expect(controller.card.reload).toHaveBeenCalledWith();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -9,10 +9,13 @@ InvoiceIn cloned: Factura clonada
|
||||||
InvoiceIn deleted: Factura eliminada
|
InvoiceIn deleted: Factura eliminada
|
||||||
Invoice list: Listado de facturas recibidas
|
Invoice list: Listado de facturas recibidas
|
||||||
InvoiceIn booked: Factura contabilizada
|
InvoiceIn booked: Factura contabilizada
|
||||||
|
Net: Neto
|
||||||
Remove tax: Quitar iva
|
Remove tax: Quitar iva
|
||||||
Remove due day: Quitar vencimiento
|
Remove due day: Quitar vencimiento
|
||||||
Sage tax: Sage iva
|
Sage tax: Sage iva
|
||||||
Sage transaction: Sage transaccion
|
Sage transaction: Sage transaccion
|
||||||
Search invoices in by reference: Buscar facturas recibidas por referencia
|
Search invoices in by reference: Buscar facturas recibidas por referencia
|
||||||
To book: Contabilizar
|
To book: Contabilizar
|
||||||
|
Total amount: Total importe
|
||||||
|
Total net: Total neto
|
||||||
|
Total stems: Total tallos
|
||||||
|
|
|
@ -27,6 +27,10 @@
|
||||||
"state": "invoiceIn.card.dueDay",
|
"state": "invoiceIn.card.dueDay",
|
||||||
"icon": "icon-calendar"
|
"icon": "icon-calendar"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"state": "invoiceIn.card.intrastat",
|
||||||
|
"icon": "icon-lines"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"state": "invoiceIn.card.log",
|
"state": "invoiceIn.card.log",
|
||||||
"icon": "history"
|
"icon": "history"
|
||||||
|
@ -109,6 +113,16 @@
|
||||||
},
|
},
|
||||||
"acl": ["administrative"]
|
"acl": ["administrative"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"url": "/intrastat",
|
||||||
|
"state": "invoiceIn.card.intrastat",
|
||||||
|
"component": "vn-invoice-in-intrastat",
|
||||||
|
"description": "Intrastat",
|
||||||
|
"params": {
|
||||||
|
"invoice-in": "$ctrl.invoiceIn"
|
||||||
|
},
|
||||||
|
"acl": ["administrative"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "/log",
|
"url": "/log",
|
||||||
"state": "invoiceIn.card.log",
|
"state": "invoiceIn.card.log",
|
||||||
|
|
|
@ -120,6 +120,37 @@
|
||||||
</vn-table>
|
</vn-table>
|
||||||
</vn-one>
|
</vn-one>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-one ng-if="$ctrl.summary.invoiceInIntrastat.length != 0">
|
||||||
|
<h4>
|
||||||
|
<a
|
||||||
|
ui-sref="invoiceIn.card.intrastat({id:$ctrl.invoiceIn.id})"
|
||||||
|
target="_self">
|
||||||
|
<span translate vn-tooltip="Go to">Intrastat</span>
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
<vn-table model="model">
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th>Code</vn-th>
|
||||||
|
<vn-th>Amount</vn-th>
|
||||||
|
<vn-th>Net</vn-th>
|
||||||
|
<vn-th>Stems</vn-th>
|
||||||
|
<vn-th>Country</vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="intrastat in $ctrl.summary.invoiceInIntrastat">
|
||||||
|
<vn-td>{{::intrastat.intrastatFk | zeroFill:8}}: {{::intrastat.intrastat.description}}</vn-td>
|
||||||
|
<vn-td>{{::intrastat.amount | currency: 'EUR':2}}</vn-td>
|
||||||
|
<vn-td>{{::intrastat.net}}</vn-td>
|
||||||
|
<vn-td>{{::intrastat.stems}}</vn-td>
|
||||||
|
<vn-td>{{::intrastat.country.code}}</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
</vn-table>
|
||||||
|
</vn-one>
|
||||||
|
</vn-horizontal>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
<vn-supplier-descriptor-popover
|
<vn-supplier-descriptor-popover
|
||||||
vn-id="supplierDescriptor">
|
vn-id="supplierDescriptor">
|
||||||
|
|
Loading…
Reference in New Issue
too many vn-focus, you just focus one.