Tarea #447 claim.action
This commit is contained in:
parent
6e9bc4645c
commit
732c100096
|
@ -0,0 +1,116 @@
|
||||||
|
<vn-crud-model
|
||||||
|
vn-id="model"
|
||||||
|
url="claim/api/ClaimEnds"
|
||||||
|
filter="$ctrl.filter"
|
||||||
|
data="$ctrl.salesClaimed" on-data-change="$ctrl.onDataChange()">
|
||||||
|
</vn-crud-model>
|
||||||
|
<vn-vertical>
|
||||||
|
<vn-card pad-large>
|
||||||
|
<vn-vertical>
|
||||||
|
<vn-horizontal>
|
||||||
|
<vn-title vn-two>Action</vn-title>
|
||||||
|
<div class="totalBox">
|
||||||
|
<vn-label-value label="Total claimed"
|
||||||
|
value="{{$ctrl.claimedTotal | currency:'€':2}}">
|
||||||
|
</vn-label-value>
|
||||||
|
</div>
|
||||||
|
</vn-horizontal>
|
||||||
|
<vn-table model="model">
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th number>Id</vn-th>
|
||||||
|
<vn-th>Destination</vn-th>
|
||||||
|
<vn-th number>Landed</vn-th>
|
||||||
|
<vn-th number>Quantity</vn-th>
|
||||||
|
<vn-th number>Description</vn-th>
|
||||||
|
<vn-th number>Price</vn-th>
|
||||||
|
<vn-th number>Disc.</vn-th>
|
||||||
|
<vn-th number>Total</vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="saleClaimed in $ctrl.salesClaimed" vn-repeat-last on-last="$ctrl.focusLastInput()">
|
||||||
|
<vn-td number>{{saleClaimed.sale.id}}</vn-td>
|
||||||
|
<vn-td>
|
||||||
|
<vn-autocomplete
|
||||||
|
vn-one
|
||||||
|
id="claimDestinationFk"
|
||||||
|
field="saleClaimed.claimDestinationFk"
|
||||||
|
url="/claim/api/ClaimDestinations"
|
||||||
|
select-fields="['id','description']"
|
||||||
|
value-field="id"
|
||||||
|
show-field="description"
|
||||||
|
on-change="$ctrl.setClaimDestination(saleClaimed.id, value)">
|
||||||
|
</vn-autocomplete>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td number>{{saleClaimed.sale.ticket.landed | dateTime: 'dd/MM/yyyy'}}</vn-td>
|
||||||
|
<vn-td number>{{saleClaimed.sale.quantity}}</vn-td>
|
||||||
|
<vn-td number>{{saleClaimed.sale.concept}}</vn-td>
|
||||||
|
<vn-td number>{{saleClaimed.sale.price | currency:'€':2}}</vn-td>
|
||||||
|
<vn-td number>{{saleClaimed.sale.discount}} %</vn-td>
|
||||||
|
<vn-td number>
|
||||||
|
{{(saleClaimed.sale.quantity * saleClaimed.sale.price) -
|
||||||
|
((saleClaimed.sale.discount *
|
||||||
|
(saleClaimed.sale.quantity * saleClaimed.sale.price))/100) | currency:'€':2
|
||||||
|
}}
|
||||||
|
</vn-td>
|
||||||
|
<vn-td number>
|
||||||
|
<vn-icon-button
|
||||||
|
medium-grey
|
||||||
|
margin-medium-v
|
||||||
|
vn-tooltip="Remove tag"
|
||||||
|
icon="remove_circle_outline"
|
||||||
|
ng-click="$ctrl.deleteClaimedSale(saleClaimed.id)"
|
||||||
|
tabindex="-1">
|
||||||
|
</vn-icon-button>
|
||||||
|
</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||||
|
No results
|
||||||
|
</vn-empty-rows>
|
||||||
|
</vn-table>
|
||||||
|
</vn-vertical>
|
||||||
|
</vn-card>
|
||||||
|
<!-- WIP
|
||||||
|
<a ng-click="$ctrl.openAddSalesDialog()" vn-tooltip="New item" vn-bind="+" fixed-bottom-right>
|
||||||
|
<vn-float-button icon="add"></vn-float-button>
|
||||||
|
</a>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Add Lines Dialog -->
|
||||||
|
<vn-dialog
|
||||||
|
vn-id="addSales">
|
||||||
|
<tpl-body>
|
||||||
|
<h3 translate>Claimable sales from ticket</h3><h3> {{$ctrl.claim.ticketFk}}</h3>
|
||||||
|
<vn-table>
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th number>Id</vn-th>
|
||||||
|
<vn-th number>Landed</vn-th>
|
||||||
|
<vn-th number>Quantity</vn-th>
|
||||||
|
<vn-th number>Description</vn-th>
|
||||||
|
<vn-th number>Price</vn-th>
|
||||||
|
<vn-th number>Disc.</vn-th>
|
||||||
|
<vn-th number>Total</vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="sale in $ctrl.salesToClaim" class="clickable" ng-click="$ctrl.addClaimedSale(sale.saleFk)">
|
||||||
|
<vn-td number>{{sale.saleFk}}</vn-td>
|
||||||
|
<vn-td number>{{sale.landed | dateTime: 'dd/MM/yyyy'}}</vn-td>
|
||||||
|
<vn-td number>{{sale.quantity}}</vn-td>
|
||||||
|
<vn-td number>{{sale.concept}}</vn-td>
|
||||||
|
<vn-td number>{{sale.price | currency:'€':2}}</vn-td>
|
||||||
|
<vn-td number>{{sale.discount}} %</vn-td>
|
||||||
|
<vn-td number>
|
||||||
|
{{(sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price))/100) | currency:'€':2}}
|
||||||
|
</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
<vn-empty-rows ng-if="model.data.length === 0" translate>
|
||||||
|
No results
|
||||||
|
</vn-empty-rows>
|
||||||
|
</vn-table>
|
||||||
|
</tpl-body>
|
||||||
|
</vn-dialog>
|
|
@ -0,0 +1,93 @@
|
||||||
|
import ngModule from '../module';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
constructor($state, $scope, $http, $translate, vnApp) {
|
||||||
|
this.$state = $state;
|
||||||
|
this.$ = $scope;
|
||||||
|
this.$http = $http;
|
||||||
|
this.$translate = $translate;
|
||||||
|
this.vnApp = vnApp;
|
||||||
|
this.filter = {
|
||||||
|
where: {claimFk: $state.params.id},
|
||||||
|
include: [
|
||||||
|
{relation: 'sale',
|
||||||
|
scope: {
|
||||||
|
fields: ['concept', 'ticketFk', 'price', 'quantity', 'discount'],
|
||||||
|
include: {
|
||||||
|
relation: 'ticket'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{relation: 'claimBeggining'}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
openAddSalesDialog() {
|
||||||
|
this.getClaimedSales();
|
||||||
|
this.$.addSales.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
getClaimedSales() {
|
||||||
|
let json = encodeURIComponent(JSON.stringify(this.claim.id));
|
||||||
|
|
||||||
|
let query = `/claim/api/ClaimBeginnings/${json}`;
|
||||||
|
this.$http.get(query).then(res => {
|
||||||
|
if (res.data) {
|
||||||
|
this.claimedSales = res.data;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
addClaimedSale(saleFk) {
|
||||||
|
let saleToAdd = {saleFk: saleFk, claimFk: this.claim.id, workerFk: this.claim.workerFk, claimDestinationFk: 1};
|
||||||
|
let query = `claim/api/ClaimEnds/`;
|
||||||
|
this.$http.post(query, saleToAdd).then(() => {
|
||||||
|
this.$.model.refresh();
|
||||||
|
this.$.addSales.hide();
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteClaimedSale(id) {
|
||||||
|
let json = encodeURIComponent(JSON.stringify(id));
|
||||||
|
let query = `claim/api/ClaimEnds/${json}`;
|
||||||
|
this.$http.delete(query).then(() => {
|
||||||
|
this.$.model.refresh();
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
focusLastInput() {
|
||||||
|
let inputs = document.querySelectorAll("#claimDestinationFk");
|
||||||
|
inputs[inputs.length - 1].querySelector("input").focus();
|
||||||
|
this.calculateTotals();
|
||||||
|
}
|
||||||
|
|
||||||
|
setClaimDestination(id, claimDestinationFk) {
|
||||||
|
let params = {id: id, claimDestinationFk: claimDestinationFk};
|
||||||
|
let query = `claim/api/ClaimEnds/`;
|
||||||
|
this.$http.patch(query, params).then(() => {
|
||||||
|
this.$.model.refresh();
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateTotals() {
|
||||||
|
this.claimedTotal = 0;
|
||||||
|
this.salesClaimed.forEach(sale => {
|
||||||
|
this.claimedTotal += (sale.sale.quantity * sale.sale.price) - ((sale.sale.discount * (sale.sale.quantity * sale.sale.price)) / 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Controller.$inject = ['$state', '$scope', '$http', '$translate', 'vnApp'];
|
||||||
|
|
||||||
|
ngModule.component('vnClaimAction', {
|
||||||
|
template: require('./index.html'),
|
||||||
|
controller: Controller,
|
||||||
|
bindings: {
|
||||||
|
claim: '<'
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,94 @@
|
||||||
|
import './index.js';
|
||||||
|
|
||||||
|
describe('claim', () => {
|
||||||
|
describe('Component vnClaimDetail', () => {
|
||||||
|
let $componentController;
|
||||||
|
let controller;
|
||||||
|
let $httpBackend;
|
||||||
|
let $state;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
angular.mock.module('claim');
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(angular.mock.inject((_$componentController_, _$state_, _$httpBackend_, $rootScope) => {
|
||||||
|
$componentController = _$componentController_;
|
||||||
|
$httpBackend = _$httpBackend_;
|
||||||
|
$httpBackend.when('GET', /\/locale\/\w+\/[a-z]{2}\.json/).respond({});
|
||||||
|
$httpBackend.when('GET', 'claim/api/Claims/ClaimBeginnings').respond({});
|
||||||
|
$state = _$state_;
|
||||||
|
$state.params.id = 1;
|
||||||
|
|
||||||
|
controller = $componentController('vnClaimDetail', {$state: $state});
|
||||||
|
controller.claim = {ticketFk: 1};
|
||||||
|
controller.$.model = {refresh: () => {}};
|
||||||
|
controller.$.addSales = {
|
||||||
|
hide: () => {},
|
||||||
|
show: () => {}
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('openAddSalesDialog()', () => {
|
||||||
|
it('should call getClaimableFromTicket and $.addSales.show', () => {
|
||||||
|
controller.$ = {addSales: {show: () => {}}};
|
||||||
|
spyOn(controller, 'getClaimableFromTicket');
|
||||||
|
spyOn(controller.$.addSales, 'show');
|
||||||
|
controller.openAddSalesDialog();
|
||||||
|
|
||||||
|
expect(controller.getClaimableFromTicket).toHaveBeenCalledWith();
|
||||||
|
expect(controller.$.addSales.show).toHaveBeenCalledWith();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getClaimableFromTicket()', () => {
|
||||||
|
it('should make a query and set salesToClaim', () => {
|
||||||
|
$httpBackend.expectGET(`/api/Sales/getClaimableFromTicket?ticketFk=1`).respond(200, 1);
|
||||||
|
controller.getClaimableFromTicket();
|
||||||
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(controller.salesToClaim).toEqual(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('addClaimedSale(saleFk)', () => {
|
||||||
|
it('should make a post and call refresh, hide and showSuccess', () => {
|
||||||
|
spyOn(controller.$.model, 'refresh');
|
||||||
|
spyOn(controller.$.addSales, 'hide');
|
||||||
|
spyOn(controller.vnApp, 'showSuccess');
|
||||||
|
$httpBackend.expectPOST(`claim/api/ClaimBeginnings/`).respond({});
|
||||||
|
controller.addClaimedSale(1);
|
||||||
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(controller.$.model.refresh).toHaveBeenCalledWith();
|
||||||
|
expect(controller.$.addSales.hide).toHaveBeenCalledWith();
|
||||||
|
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('deleteClaimedSale(id)', () => {
|
||||||
|
it('should make a delete and call refresh and showSuccess', () => {
|
||||||
|
spyOn(controller.$.model, 'refresh');
|
||||||
|
spyOn(controller.vnApp, 'showSuccess');
|
||||||
|
$httpBackend.expectDELETE(`claim/api/ClaimBeginnings/1`).respond({});
|
||||||
|
controller.deleteClaimedSale(1);
|
||||||
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(controller.$.model.refresh).toHaveBeenCalledWith();
|
||||||
|
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('setClaimedQuantity(id, claimedQuantity)', () => {
|
||||||
|
it('should make a patch and call refresh and showSuccess', () => {
|
||||||
|
spyOn(controller.$.model, 'refresh');
|
||||||
|
spyOn(controller.vnApp, 'showSuccess');
|
||||||
|
$httpBackend.expectPATCH(`claim/api/ClaimBeginnings/`).respond({});
|
||||||
|
controller.setClaimedQuantity(1, 1);
|
||||||
|
$httpBackend.flush();
|
||||||
|
|
||||||
|
expect(controller.$.model.refresh).toHaveBeenCalledWith();
|
||||||
|
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,3 @@
|
||||||
|
Destination: Destino
|
||||||
|
Action: Actuaciones
|
||||||
|
Total claimed: Total Reclamado
|
|
@ -0,0 +1,16 @@
|
||||||
|
vn-claim-action {
|
||||||
|
vn-dialog[vn-id=addSales] {
|
||||||
|
tpl-body {
|
||||||
|
width: 950px;
|
||||||
|
div {
|
||||||
|
div.buttons {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
vn-table{
|
||||||
|
min-width: 950px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
export * from './module';
|
export * from './module';
|
||||||
|
|
||||||
import './index/';
|
import './action';
|
||||||
|
import './basic-data';
|
||||||
import './card';
|
import './card';
|
||||||
import './search-panel';
|
|
||||||
import './detail';
|
import './detail';
|
||||||
import './descriptor';
|
import './descriptor';
|
||||||
import './basic-data';
|
// import './development';
|
||||||
|
import './index/';
|
||||||
|
import './search-panel';
|
||||||
// import './summary';
|
// import './summary';
|
||||||
|
|
Loading…
Reference in New Issue