diff --git a/modules/ticket/front/index.js b/modules/ticket/front/index.js index c3f15b214f..195f172e0d 100644 --- a/modules/ticket/front/index.js +++ b/modules/ticket/front/index.js @@ -18,7 +18,6 @@ import './expedition'; import './volume'; import './package/index'; import './sale'; -import './sale/editDiscount'; import './tracking/index'; import './tracking/edit'; import './sale-checked'; diff --git a/modules/ticket/front/sale/editDiscount.html b/modules/ticket/front/sale/editDiscount.html deleted file mode 100644 index c23645784b..0000000000 --- a/modules/ticket/front/sale/editDiscount.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
MANÁ: {{$ctrl.mana | currency: 'EUR':0}}
-
-
- - -
-

New price

-

{{$ctrl.newPrice | currency: 'EUR':2}}

-
-
\ No newline at end of file diff --git a/modules/ticket/front/sale/editDiscount.js b/modules/ticket/front/sale/editDiscount.js deleted file mode 100644 index 08385a24e1..0000000000 --- a/modules/ticket/front/sale/editDiscount.js +++ /dev/null @@ -1,88 +0,0 @@ -import ngModule from '../module'; -import Component from 'core/lib/component'; - -class Controller extends Component { - set edit(value) { - this._edit = value; - this.clearDiscount(); - this.setNewDiscount(); - } - - get edit() { - return this._edit; - } - - set bulk(value) { - this._bulk = value; - this.setNewDiscount(); - } - - get bulk() { - return this._bulk; - } - - get newDiscount() { - return this._newDiscount; - } - - set newDiscount(value) { - this._newDiscount = value; - this.updateNewPrice(); - } - - updateNewPrice() { - if (this.newDiscount && this.edit[0]) - this.newPrice = (this.edit[0].quantity * this.edit[0].price) - ((this.newDiscount * (this.edit[0].quantity * this.edit[0].price)) / 100); - } - - setNewDiscount() { - if (!this.newDiscount && this.edit[0]) - this.newDiscount = this.edit[0].discount; - } - - updateDiscount() { - let salesIds = []; - let modified = false; - - if (this.newDiscount == null) return; - - for (let i = 0; i < this.edit.length; i++) { - if (this.newDiscount != this.edit[0].discount || this.bulk || !this.newDiscount) { - salesIds.push(this.edit[i].id); - modified = true; - } - } - - if (modified) { - const params = {salesIds: salesIds, newDiscount: this.newDiscount}; - const query = `Tickets/${this.$params.id}/updateDiscount`; - this.$http.post(query, params).then(() => { - this.vnApp.showSuccess(this.$translate.instant('Data saved!')); - console.log(this.edit[0].sale); - this.edit[0].sale.price = 277; - this.clearDiscount(); - modified = false; - }).catch(e => { - this.vnApp.showError(e.message); - }); - - this.onHide(); - } else - this.vnApp.showError(this.$translate.instant('There are no changes to save')); - } - - clearDiscount() { - this.newDiscount = null; - } -} - -ngModule.component('vnTicketSaleEditDiscount', { - template: require('./editDiscount.html'), - controller: Controller, - bindings: { - edit: ' { - if (sale.checked) indexList.push(index); - }); - - return indexList; - } - resetChanges() { if (this.newInstances().length === 0) this.$.watcher.updateOriginalData(); @@ -197,8 +180,7 @@ class Controller extends Section { showTransferPopover(event) { this.setTransferParams(); - this.$.transfer.parent = event.target; - this.$.transfer.show(); + this.$.transfer.show(event); } setTransferParams() { diff --git a/modules/ticket/front/sale/specs/index.spec.js b/modules/ticket/front/sale/specs/index.spec.js index 1c8fbda534..7848a36b9d 100644 --- a/modules/ticket/front/sale/specs/index.spec.js +++ b/modules/ticket/front/sale/specs/index.spec.js @@ -9,33 +9,33 @@ describe('Ticket', () => { let $state; let $httpBackend; - const ticket = { - id: 1, - clientFk: 101, - shipped: 1, - created: new Date(), - client: {salesPersonFk: 1}, - address: {mobile: 111111111} - }; - const sales = [ - { - id: 1, - concept: 'Item 1', - quantity: 5, - price: 23.5, - discount: 0, - }, { - id: 4, - concept: 'Item 2', - quantity: 20, - price: 5.5, - discount: 0, - } - ]; - beforeEach(ngModule('ticket')); beforeEach(angular.mock.inject(($componentController, $rootScope, _$state_, _$httpBackend_) => { + const ticket = { + id: 1, + clientFk: 101, + shipped: 1, + created: new Date(), + client: {salesPersonFk: 1}, + address: {mobile: 111111111} + }; + const sales = [ + { + id: 1, + concept: 'Item 1', + quantity: 5, + price: 23.5, + discount: 0, + }, { + id: 4, + concept: 'Item 2', + quantity: 20, + price: 5.5, + discount: 0, + } + ]; + $state = _$state_; $scope = $rootScope.$new(); $scope.watcher = watcher; @@ -56,300 +56,271 @@ describe('Ticket', () => { const $element = angular.element(''); controller = $componentController('vnTicketSale', {$element, $scope}); controller.card = {reload: () => {}}; - controller.ticket = ticket; - controller.sales = sales; + controller._ticket = ticket; + controller._sales = sales; })); + describe('ticket() setter', () => { + it('should set the ticket data an then call the isTicketEditable() and isTicketLocked() methods', () => { + jest.spyOn(controller, 'isTicketEditable').mockReturnThis(); + jest.spyOn(controller, 'isTicketLocked').mockReturnThis(); + + controller.ticket = {id: 1}; + + expect(controller.isTicketEditable).toHaveBeenCalledWith(); + expect(controller.isTicketLocked).toHaveBeenCalledWith(); + }); + }); + + describe('sales() setter', () => { + it('should set the sales data an then call the refreshTotal() method', () => { + jest.spyOn(controller, 'refreshTotal').mockReturnThis(); + + controller.sales = [{id: 1}]; + + expect(controller.refreshTotal).toHaveBeenCalledWith(); + }); + }); + + describe('getSubTotal()', () => { + it('should make an HTTP GET query and then set the subtotal property', () => { + const expectedAmount = 128; + + $httpBackend.expect('GET', 'Tickets/1/subtotal').respond(200, expectedAmount); + controller.getSubTotal(); + $httpBackend.flush(); + + expect(controller.subtotal).toEqual(expectedAmount); + }); + }); + + describe('getSaleTotal()', () => { + it('should return the sale total amount', () => { + const sale = { + quantity: 10, + price: 2, + discount: 10 + }; + + const expectedAmount = 18; + const result = controller.getSaleTotal(sale); + + expect(result).toEqual(expectedAmount); + }); + }); + + describe('getMana()', () => { + it('should make an HTTP GET query and return the worker mana', () => { + controller.edit = {}; + const expectedAmount = 250; + + $httpBackend.expect('GET', 'Tickets/1/getSalesPersonMana').respond(200, expectedAmount); + controller.getMana(); + $httpBackend.flush(); + + expect(controller.edit.mana).toEqual(expectedAmount); + }); + }); + + describe('getVat()', () => { + it('should make an HTTP GET query and return the ticket VAT', () => { + controller.edit = {}; + const expectedAmount = 67; + + $httpBackend.expect('GET', 'Tickets/1/getVAT').respond(200, expectedAmount); + controller.getVat(); + $httpBackend.flush(); + + expect(controller.VAT).toEqual(expectedAmount); + }); + }); + + describe('selectedSales()', () => { + it('should return a list of selected sales', () => { + controller.sales[1].checked = true; + + const expectedSaleId = 4; + const result = controller.selectedSales(); + const firstSelectedSale = result[0]; + + expect(result.length).toEqual(1); + expect(firstSelectedSale.id).toEqual(expectedSaleId); + }); + }); + + describe('selectedValidSales()', () => { + it('should return a list of selected sales having a sale id', () => { + const newEmptySale = {quantity: 10, checked: true}; + controller.sales.push(newEmptySale); + controller.sales[0].checked = true; + + const expectedSaleId = 1; + const result = controller.selectedValidSales(); + const firstSelectedSale = result[0]; + + expect(result.length).toEqual(1); + expect(firstSelectedSale.id).toEqual(expectedSaleId); + }); + }); + + describe('selectedSalesCount()', () => { + it('should return the number of selected sales', () => { + controller.sales[0].checked = true; + + const result = controller.selectedSalesCount(); + + expect(result).toEqual(1); + }); + }); + + describe('hasSelectedSales()', () => { + it('should return truthy if atleast one sale is selected', () => { + controller.sales[0].checked = true; + + const result = controller.hasSelectedSales(); + + expect(result).toBeTruthy(); + }); + }); + + describe('hasOneSaleSelected()', () => { + it('should return truthy if just one sale is selected', () => { + controller.sales[0].checked = true; + + const result = controller.hasOneSaleSelected(); + + expect(result).toBeTruthy(); + }); + + it('should return falsy if more than one sale is selected', () => { + controller.sales[0].checked = true; + controller.sales[1].checked = true; + + const result = controller.hasOneSaleSelected(); + + expect(result).toBeFalsy(); + }); + }); + + describe('newInstances()', () => { + it(`should return a list of sales that doesn't have an id`, () => { + const newEmptySale = {quantity: 10, checked: true}; + controller.sales.push(newEmptySale); + + const result = controller.newInstances(); + const firstNewSale = result[0]; + + expect(result.length).toEqual(1); + expect(firstNewSale.id).toBeUndefined(); + expect(firstNewSale.quantity).toEqual(10); + }); + }); + + describe('resetChanges()', () => { + it(`should not call the watcher updateOriginalData() method`, () => { + jest.spyOn(controller.$.watcher, 'updateOriginalData').mockReturnThis(); + + const newEmptySale = {quantity: 10}; + controller.sales.push(newEmptySale); + controller.resetChanges(); + + expect(controller.$.watcher.updateOriginalData).not.toHaveBeenCalledWith(); + }); + + it(`should call the watcher updateOriginalData() method`, () => { + jest.spyOn(controller.$.watcher, 'updateOriginalData').mockReturnThis(); + + controller.resetChanges(); + + expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); + }); + }); + + describe('changeState()', () => { + it('should make an HTTP post query, then call the showSuccess(), reload() and resetChanges() methods', () => { + jest.spyOn(controller.card, 'reload').mockReturnThis(); + jest.spyOn(controller.vnApp, 'showSuccess').mockReturnThis(); + jest.spyOn(controller, 'resetChanges').mockReturnThis(); + + const expectedParams = {ticketFk: 1, code: 'OK'}; + $httpBackend.expect('POST', `TicketTrackings/changeState`, expectedParams).respond(200); + controller.changeState('OK'); + $httpBackend.flush(); + + expect(controller.card.reload).toHaveBeenCalledWith(); + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + expect(controller.resetChanges).toHaveBeenCalledWith(); + }); + }); + + describe('removeSales()', () => { + it('should make an HTTP post query, then call the showSuccess(), removeSelectedSales() and resetChanges() methods', () => { + jest.spyOn(controller.vnApp, 'showSuccess').mockReturnThis(); + jest.spyOn(controller, 'removeSelectedSales').mockReturnThis(); + jest.spyOn(controller, 'resetChanges').mockReturnThis(); + + const firstSale = controller.sales[0]; + firstSale.checked = true; + const expectedParams = {sales: [firstSale], actualTicketFk: 1}; + $httpBackend.expect('POST', `Sales/removes`, expectedParams).respond(200); + controller.removeSales(); + $httpBackend.flush(); + + expect(controller.removeSelectedSales).toHaveBeenCalledWith(); + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + expect(controller.resetChanges).toHaveBeenCalledWith(); + }); + }); + + describe('removeSelectedSales()', () => { + it('should remove the selected sales from the controller sale property', () => { + jest.spyOn(controller, 'refreshTotal').mockReturnThis(); + jest.spyOn(controller, 'resetChanges').mockReturnThis(); + + const firstSale = controller.sales[0]; + firstSale.checked = true; + + controller.removeSelectedSales(); + + const lastSale = controller.sales[0]; + + expect(controller.sales.length).toEqual(1); + expect(lastSale.id).toEqual(4); + expect(controller.refreshTotal).toHaveBeenCalledWith(); + }); + }); + describe('createClaim()', () => { it('should perform a query and call windows open', () => { - jest.spyOn(controller.$state, 'go'); + jest.spyOn(controller, 'resetChanges').mockReturnThis(); + jest.spyOn(controller.$state, 'go').mockReturnThis(); - const claim = {id: 1}; - const sales = [{id: 1}, {id: 2}]; + const newEmptySale = {quantity: 10}; + controller.sales.push(newEmptySale); + const firstSale = controller.sales[0]; + firstSale.checked = true; - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - $httpBackend.when('POST', `Claims/createFromSales`, {claim: claim, sales: sales}).respond(claim); - $httpBackend.expect('POST', `Claims/createFromSales`).respond(claim); + const expectedParams = { + claim: {ticketFk: 1, clientFk: 101, ticketCreated: 1}, + sales: [firstSale] + }; + + $httpBackend.expect('POST', `Claims/createFromSales`, expectedParams).respond(200, {id: 1}); controller.createClaim(); $httpBackend.flush(); - expect(controller.subtotal).toEqual(227.5); - expect(controller.VAT).toEqual(10.5); - expect(controller.total).toEqual(238); + expect(controller.resetChanges).toHaveBeenCalledWith(); expect(controller.$state.go).toHaveBeenCalledWith('claim.card.basicData', {id: 1}); }); }); - describe('isChecked() getter', () => { - it('should set isChecked value to true when one of the instances has the value checked to true', () => { - controller.sales[0].checked = true; - - expect(controller.isChecked).toBeTruthy(); - }); - }); - - describe('checkedLines()', () => { - it('should make an array of the instances with the property checked true()', () => { - let sale = controller.sales[0]; - sale.checked = true; - let expectedResult = [sale]; - - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - let result = controller.checkedLines(); - $httpBackend.flush(); - - expect(result).toEqual(expectedResult); - }); - }); - - describe('onStateOkClick()', () => { - it('should perform a get and then call a function', () => { - let filter = {where: {code: 'OK'}, fields: ['id']}; - filter = encodeURIComponent(JSON.stringify(filter)); - let res = [{id: 3}]; - jest.spyOn(controller, 'onStateChange').mockReturnThis(); - - $httpBackend.whenGET(`States?filter=${filter}`).respond(res); - $httpBackend.expectGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.expectGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.onStateOkClick(); - $httpBackend.flush(); - - expect(controller.onStateChange).toHaveBeenCalledWith(3); - }); - }); - - describe('onStateChange()', () => { - it('should perform a post and then call a function', () => { - $httpBackend.expectPOST(`TicketTrackings/changeState`).respond(); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.onStateChange(3); - $httpBackend.flush(); - }); - }); - - describe('onRemoveLinesClick()', () => { - it('should call getCheckedLines, call removeInstances, and make a query', () => { - controller.sales[0].checked = true; - - $httpBackend.whenPOST(`Sales/removes`).respond(); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.onRemoveLinesClick('accept'); - $httpBackend.flush(); - - expect(controller.sales.length).toEqual(1); - }); - }); - - describe('unmarkAsReserved()', () => { - it('should call setReserved with false', () => { - jest.spyOn(controller, 'setReserved'); - - controller.unmarkAsReserved(false); - - expect(controller.setReserved).toHaveBeenCalledWith(false); - }); - }); - - describe('markAsReserved()', () => { - it('should call setReserved with true', () => { - jest.spyOn(controller, 'setReserved'); - - controller.markAsReserved(true); - - expect(controller.setReserved).toHaveBeenCalledWith(true); - }); - }); - - describe('setReserved()', () => { - it('should call getCheckedLines, $.index.accept and make a query ', () => { - const sale = controller.sales[0]; - sale.checked = true; - let expectedRequest = { - sales: [sale], - ticketFk: ticket.id, - reserved: false - }; - - $httpBackend.expectPOST(`Sales/reserve`, expectedRequest).respond(); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.unmarkAsReserved(false); - $httpBackend.flush(); - }); - }); - - describe('showSMSDialog()', () => { - it('should open an SMS dialog with specified data', () => { - jest.spyOn(controller.$.sms, 'open'); - - controller.sales[0].checked = true; - controller.showSMSDialog(); - - expect(controller.$.sms.open).toHaveBeenCalledWith(); - expect(controller.newSMS.destination).toEqual(111111111); - expect(controller.newSMS.message).not.toEqual(''); - }); - }); - - describe('onChangeQuantity()', () => { - it('should not call addSale() or updateQuantity() methods', () => { - jest.spyOn(controller, 'addSale'); - jest.spyOn(controller, 'updateQuantity'); - - const sale = {itemFk: 4}; - controller.onChangeQuantity(sale); - - expect(controller.addSale).not.toHaveBeenCalled(); - expect(controller.updateQuantity).not.toHaveBeenCalled(); - }); - - it('should call addSale() method', () => { - jest.spyOn(controller, 'addSale'); - - const sale = {itemFk: 4, quantity: 5}; - controller.onChangeQuantity(sale); - - expect(controller.addSale).toHaveBeenCalledWith(sale); - }); - - it('should call updateQuantity() method', () => { - jest.spyOn(controller, 'updateQuantity'); - jest.spyOn(controller, 'addSale'); - - const sale = {id: 1, itemFk: 4, quantity: 5}; - controller.onChangeQuantity(sale); - - expect(controller.addSale).not.toHaveBeenCalled(); - expect(controller.updateQuantity).toHaveBeenCalledWith(sale); - }); - }); - - describe('updateQuantity()', () => { - it('should make a POST query saving sale quantity', () => { - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - const data = {quantity: 10}; - const sale = sales[0]; - sale.quantity = 10; - - $httpBackend.when('POST', `Sales/4/updateQuantity`, data).respond(); - $httpBackend.expect('POST', `Sales/4/updateQuantity`, data).respond(); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.updateQuantity(sale); - $httpBackend.flush(); - - expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); - }); - }); - - describe('updateConcept()', () => { - it('should make a POST query saving sale concept', () => { - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - const data = {newConcept: 'My new weapon'}; - const sale = sales[0]; - sale.concept = 'My new weapon'; - - $httpBackend.when('POST', `Sales/4/updateConcept`, data).respond(); - $httpBackend.expect('POST', `Sales/4/updateConcept`, data).respond(); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.updateConcept(sale); - $httpBackend.flush(); - - expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); - }); - }); - - describe('addSale()', () => { - it('should make a POST query adding a new sale', () => { - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - const newSale = {itemFk: 4, quantity: 10}; - const params = {itemId: 4, quantity: 10}; - - const expectedResult = { - id: 30, - quantity: 10, - discount: 0, - price: 0, - itemFk: 4, - item: { - subName: 'Item subName', - image: '30.png' - } - }; - - $httpBackend.when('POST', `tickets/1/addSale`, params).respond(expectedResult); - $httpBackend.expect('POST', `tickets/1/addSale`, params).respond(expectedResult); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.addSale(newSale); - $httpBackend.flush(); - - expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); - }); - }); - - describe('transferSales()', () => { - it('should transfer sales to a ticket', () => { - jest.spyOn(controller, 'goToTicket'); - controller.transfer = { - sales: [{id: 1, itemFk: 1}, {id: 2, itemFk: 4}] - }; - - const expectedResponse = {id: 13}; - const params = { - ticketId: 13, - sales: controller.transfer.sales - }; - - $httpBackend.when('POST', `tickets/1/transferSales`, params).respond(expectedResponse); - $httpBackend.expect('POST', `tickets/1/transferSales`, params).respond(expectedResponse); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.transferSales(13); - $httpBackend.flush(); - - expect(controller.goToTicket).toHaveBeenCalledWith(13); - }); - }); - describe('setTransferParams()', () => { it('should define the transfer object on the controller and its default properties', () => { - let sale = controller.sales[0]; - sale.checked = true; - const expectedResponse = [sale]; + const firstSale = controller.sales[0]; + firstSale.checked = true; + const expectedResponse = [firstSale]; - $httpBackend.when('GET', `clients/101/lastActiveTickets?ticketId=1`).respond(expectedResponse); $httpBackend.expect('GET', `clients/101/lastActiveTickets?ticketId=1`).respond(expectedResponse); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); controller.setTransferParams(); $httpBackend.flush(); @@ -357,52 +328,152 @@ describe('Ticket', () => { expect(controller.transfer).toBeDefined(); expect(lastActiveTickets).toBeDefined(); - expect(lastActiveTickets[0].id).toEqual(4); + expect(lastActiveTickets[0].id).toEqual(1); }); }); - describe('newOrderFromTicket()', () => { - it('should make an HTTP post query and then open the new order on a new tab', () => { - const params = {ticketFk: 1}; - const expectedResponse = {id: 123}; + describe('transferSales()', () => { + it('should transfer sales to a ticket and then call to the $state go() method', () => { + jest.spyOn(controller.$state, 'go').mockReturnThis(); - window.open = jasmine.createSpy('open'); - controller.$state.href = jasmine.createSpy('href') - .and.returnValue('/somePath'); + controller.transfer = { + sales: [{id: 1, itemFk: 1}, {id: 2, itemFk: 4}] + }; - $httpBackend.when('POST', `Orders/newFromTicket`, params).respond(expectedResponse); - $httpBackend.expect('POST', `Orders/newFromTicket`, params).respond(expectedResponse); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - controller.newOrderFromTicket(); + const ticketIdToTransfer = 13; + const expectedResponse = {id: ticketIdToTransfer}; + const params = { + ticketId: 13, + sales: controller.transfer.sales + }; + + $httpBackend.expect('POST', `tickets/1/transferSales`, params).respond(expectedResponse); + controller.transferSales(ticketIdToTransfer); $httpBackend.flush(); - expect(window.open).toHaveBeenCalledWith('/somePath', '_blank'); + expect(controller.$state.go).toHaveBeenCalledWith('ticket.card.sale', {id: ticketIdToTransfer}); }); }); - describe('hasOneSaleSelected()', () => { - it('should return true if just one sale is selected', () => { - controller.sales[0].checked = true; + describe('updatePrice()', () => { + it('should make an HTTP POST query, update the sale price and then call to the resetChanges() method', () => { + jest.spyOn(controller.vnApp, 'showSuccess').mockReturnThis(); + jest.spyOn(controller, 'resetChanges').mockReturnThis(); - expect(controller.hasOneSaleSelected()).toBeTruthy(); - }); - }); - - describe('calculateSalePrice()', () => { - it('should make an HTTP post query ', () => { - controller.sales[0].checked = true; - - $httpBackend.when('POST', `Sales/4/recalculatePrice`).respond(200); - $httpBackend.whenGET(`Tickets/1/subtotal`).respond(200, 227.5); - $httpBackend.whenGET(`Tickets/1/getVAT`).respond(200, 10.5); - $httpBackend.whenGET(`Tickets/1/isEditable`).respond(); - $httpBackend.whenGET(`Tickets/1/isLocked`).respond(); - - controller.calculateSalePrice(); + const selectedSale = controller.sales[0]; + selectedSale.checked = true; + controller.$.editPricePopover = {hide: jest.fn()}; + controller.edit = { + price: 2, + sale: selectedSale + }; + const expectedParams = {newPrice: 2}; + $httpBackend.expect('POST', `Sales/1/updatePrice`, expectedParams).respond(200, {price: 2}); + controller.updatePrice(); $httpBackend.flush(); + + expect(selectedSale.price).toEqual(2); + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + expect(controller.$.editPricePopover.hide).toHaveBeenCalledWith(); + expect(controller.resetChanges).toHaveBeenCalledWith(); + }); + }); + + describe('changeDiscount()', () => { + it('should call to the updateDiscount() method and then to the editDiscount hide() method', () => { + jest.spyOn(controller, 'updateDiscount').mockReturnThis(); + + const selectedSale = controller.sales[0]; + selectedSale.checked = true; + const expectedSale = selectedSale; + controller.$.editDiscount = {hide: jest.fn()}; + controller.edit = { + discount: 10, + sale: selectedSale + }; + + controller.changeDiscount(); + + expect(controller.updateDiscount).toHaveBeenCalledWith([expectedSale]); + expect(controller.$.editDiscount.hide).toHaveBeenCalledWith(); + }); + }); + + describe('changeMultipleDiscount()', () => { + it('should call to the updateDiscount() method and then to the editDiscountDialog hide() method', () => { + jest.spyOn(controller, 'updateDiscount').mockReturnThis(); + + const firstSelectedSale = controller.sales[0]; + firstSelectedSale.checked = true; + + const secondSelectedSale = controller.sales[1]; + secondSelectedSale.checked = true; + + const expectedSales = [firstSelectedSale, secondSelectedSale]; + controller.$.editDiscountDialog = {hide: jest.fn()}; + controller.edit = { + discount: 10, + sales: expectedSales + }; + + controller.changeMultipleDiscount(); + + expect(controller.updateDiscount).toHaveBeenCalledWith(expectedSales); + expect(controller.$.editDiscountDialog.hide).toHaveBeenCalledWith(); + }); + + it('should not call to the updateDiscount() method and then to the editDiscountDialog hide() method', () => { + jest.spyOn(controller, 'updateDiscount').mockReturnThis(); + + const firstSelectedSale = controller.sales[0]; + firstSelectedSale.checked = true; + firstSelectedSale.discount = 10; + + const secondSelectedSale = controller.sales[1]; + secondSelectedSale.checked = true; + secondSelectedSale.discount = 10; + + const expectedSales = [firstSelectedSale, secondSelectedSale]; + controller.$.editDiscountDialog = {hide: jest.fn()}; + controller.edit = { + discount: 10, + sales: expectedSales + }; + + controller.changeMultipleDiscount(); + + expect(controller.updateDiscount).not.toHaveBeenCalledWith(expectedSales); + expect(controller.$.editDiscountDialog.hide).toHaveBeenCalledWith(); + }); + }); + + describe('updateDiscount()', () => { + it('should make an HTTP POST query, update the sales discount and then call to the resetChanges() method', () => { + jest.spyOn(controller, 'resetChanges').mockReturnThis(); + jest.spyOn(controller.vnApp, 'showSuccess').mockReturnThis(); + + const expectedDiscount = 10; + const firstSelectedSale = controller.sales[0]; + firstSelectedSale.checked = true; + + const secondSelectedSale = controller.sales[1]; + secondSelectedSale.checked = true; + + controller.edit = { + discount: expectedDiscount + }; + + const expectedSales = [firstSelectedSale, secondSelectedSale]; + const expectedSaleIds = [firstSelectedSale.id, secondSelectedSale.id]; + const expectedParams = {salesIds: expectedSaleIds, newDiscount: expectedDiscount}; + $httpBackend.expect('POST', `Tickets/1/updateDiscount`, expectedParams).respond(200, {discount: 10}); + controller.updateDiscount(expectedSales); + $httpBackend.flush(); + + expect(firstSelectedSale.discount).toEqual(expectedDiscount); + expect(secondSelectedSale.discount).toEqual(expectedDiscount); + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + expect(controller.resetChanges).toHaveBeenCalledWith(); }); }); });