Commit 58b47f37 authored by Denis Zaykov's avatar Denis Zaykov
Browse files

CDEK-981: Delivery and Return undelivered documents.

parent f30ef37a
Showing with 988 additions and 136 deletions
+988 -136
......@@ -38,6 +38,16 @@ public class WarehouseMVCController extends BaseMVCController{
return "/warehouse/add_acceptance";
}
@RequestMapping(value = "/add_return_undelivered", method = RequestMethod.GET)
public String add_return_undelivered(Locale locale, @ModelAttribute("model") ModelMap model) {
return "/warehouse/add_return_undelivered";
}
@RequestMapping(value = "/add_delivery", method = RequestMethod.GET)
public String add_delivery(Locale locale, @ModelAttribute("model") ModelMap model) {
return "/warehouse/add_delivery";
}
@RequestMapping(value = "/warehouse", method = RequestMethod.GET)
public String warehouse(Locale locale, @ModelAttribute("model") ModelMap model) {
return "/warehouse/warehouse";
......
......@@ -161,6 +161,62 @@ public class SkedRestController extends AbstractRestController {
return sked;
}
@RequestMapping(value = "newDelivery", method = RequestMethod.POST)
public @ResponseBody SkedTO createDelivery() {
User user = findUser(user().getCode(), user().getLang());
Branch branch = findBranch(user.getBranchCode(), user.getLang());
SkedTO sked = new SkedTO();
sked.setAimType(Sked.AIM_TO_CLIENT);
sked.setOperType(Sked.TYPE_OUT);
sked.setDocumentType(DocumentType.DELIVERY);
sked.setBranch(branch);
Employee employee = findEmployee(user.getEmployeeCode(), user().getLang());
sked.setEmployeeIn(employee);
sked.setEmployeeOut(employee);
sked.setDate(new Date());
WarehouseFilter filter = new WarehouseFilter();
filter.setLang(user().getLang());
filter.setIsIncome(true);
filter.setUserCode(user().getCode());
List<Warehouse> warehouses = warehouseClient.findWarehouses(filter);
if(warehouses.size()>0){
sked.setWarehouse(warehouses.get(0));
}
return sked;
}
@RequestMapping(value = "newReturnUndelivered", method = RequestMethod.POST)
public @ResponseBody SkedTO createReturnUndelivered() {
User user = findUser(user().getCode(), user().getLang());
Branch branch = findBranch(user.getBranchCode(), user.getLang());
SkedTO sked = new SkedTO();
sked.setAimType(Sked.AIM_FROM_CLIENT);
sked.setOperType(Sked.TYPE_IN);
sked.setDocumentType(DocumentType.RETURN_UNDELIVERED);
sked.setBranch(branch);
Employee employee = findEmployee(user.getEmployeeCode(), user().getLang());
sked.setEmployeeIn(employee);
sked.setEmployeeOut(employee);
sked.setDate(new Date());
WarehouseFilter filter = new WarehouseFilter();
filter.setLang(user().getLang());
filter.setIsIncome(true);
filter.setUserCode(user().getCode());
List<Warehouse> warehouses = warehouseClient.findWarehouses(filter);
if(warehouses.size()>0){
sked.setWarehouse(warehouses.get(0));
}
return sked;
}
@RequestMapping(value = "/newAcceptance", method = RequestMethod.POST)
public @ResponseBody SkedTO createNewAcceptance() {
......
......@@ -654,6 +654,8 @@ warehouse.opis.closeCorrectionIncome.title = Close the Correction income documen
warehouse.opis.closeAcceptance.title = Close the Acceptance document
warehouse.opis.closeConsolidation.title = Close the Consolidation document
warehouse.opis.closePrimeIncome.title = Close the Prime income document
warehouse.opis.closeDelivery.title = Close the Delivery document
warehouse.opis.closeReturnUndelivered.title = Close the Return undelivered document
warehouse.opis.consolidation = Consolidation
warehouse.opis.dateClose = Closing date and time
warehouse.opis.dateCreate = Created date and time
......@@ -685,6 +687,12 @@ warehouse.opis.correctionIncomeCreate.title= Create a new Correction Income docu
warehouse.opis.correctionIncomeUpdate.title= Update Correction Income document
warehouse.opis.consolidationCreate.title = Create a new Consolidation document
warehouse.opis.consolidationUpdate.title = Update Consolidation document
warehouse.opis.delivery = Delivery
warehouse.opis.deliveryCreate.title = Create a new Delivery document
warehouse.opis.deliveryUpdate.title = Update Delivery document
warehouse.opis.returnUndelivered = Return undelivered
warehouse.opis.returnUndeliveredCreate.title = Create a new Return undelivered document
warehouse.opis.returnUndeliveredUpdate.title = Update Return undelivered document
warehouse.opis.subdivisionIn = To
warehouse.opis.subdivisionOut = From
warehouse.opis.sync.problem = Sync problem
......
......@@ -653,6 +653,8 @@ warehouse.opis.closeCorrectionIncome.title = \u0417\u0430\u043A\u0440\u044B\u044
warehouse.opis.closeAcceptance.title = \u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041F\u0440\u0438\u0435\u043C\u043A\u0430"
warehouse.opis.closeConsolidation.title = \u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041A\u043E\u043D\u0441\u043E\u043B\u0438\u0434\u0430\u0446\u0438\u044F"
warehouse.opis.closePrimeIncome.title = \u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041F\u0435\u0440\u0432\u0438\u0447\u043D\u044B\u0439 \u041F\u0440\u0438\u0445\u043E\u0434"
warehouse.opis.closeDelivery.title = \u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u044B\u0434\u0430\u0447\u0430 \u043D\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0443"
warehouse.opis.closeReturnUndelivered.title = \u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E"
warehouse.opis.consolidation = \u041A\u043E\u043D\u0441\u043E\u043B\u0438\u0434\u0430\u0446\u0438\u044F
warehouse.opis.dateClose = \u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F
warehouse.opis.dateCreate = \u0414\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F
......@@ -684,6 +686,12 @@ warehouse.opis.correctionIncomeCreate.title= \u0421\u043E\u0437\u0434\u0430\u044
warehouse.opis.correctionIncomeUpdate.title= \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041F\u0440\u0438\u0445\u043E\u0434 \u041A\u043E\u0440\u0440\u0435\u043A\u0446\u0438\u044F"
warehouse.opis.consolidationCreate.title = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041A\u043E\u043D\u0441\u043E\u043B\u0438\u0434\u0430\u0446\u0438\u044F"
warehouse.opis.consolidationUpdate.title = \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u041A\u043E\u043D\u0441\u043E\u043B\u0438\u0434\u0430\u0446\u0438\u044F"
warehouse.opis.delivery = \u0412\u044B\u0434\u0430\u0447\u0430 \u043D\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0443
warehouse.opis.deliveryCreate.title = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u044B\u0434\u0430\u0447\u0430 \u043D\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0443"
warehouse.opis.deliveryUpdate.title = \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u044B\u0434\u0430\u0447\u0430 \u043D\u0430 \u0434\u043E\u0441\u0442\u0430\u0432\u043A\u0443"
warehouse.opis.returnUndelivered = \u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E
warehouse.opis.returnUndeliveredCreate.title = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E"
warehouse.opis.returnUndeliveredUpdate.title = \u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 "\u0412\u043E\u0437\u0432\u0440\u0430\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E"
warehouse.opis.subdivisionIn = \u0412 \u043F\u043E\u0434\u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435
warehouse.opis.subdivisionOut = \u0418\u0437 \u043F\u043E\u0434\u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u044F
warehouse.opis.sync.problem = \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0438
......
......@@ -634,6 +634,8 @@ warehouse.opis.close.title = \u9501\u5B9A\u6E05\u5355
warehouse.opis.closeAcceptance.title = \u63A5\u8D27\u6E05\u5355
warehouse.opis.closeConsolidation.title = \u96C6\u8D27\u6E05\u5355
warehouse.opis.closePrimeIncome.title = \u9996\u6B21\u63A5\u8D27\u6E05\u5355
warehouse.opis.closeDelivery.title =
warehouse.opis.closeReturnUndelivered.title =
warehouse.opis.consolidation = \u96C6\u8D27\u6E05\u5355
warehouse.opis.consolidationCreate.title = \u65B0\u5EFA\u96C6\u8D27\u6E05\u5355
warehouse.opis.consolidationUpdate.title = \u66F4\u65B0\u96C6\u8D27\u6E05\u5355
......@@ -668,6 +670,13 @@ warehouse.opis.correctionShipment =
warehouse.opis.correctionIncome =
warehouse.opis.correctionIncomeCreate.title =
warehouse.opis.correctionIncomeUpdate.title =
warehouse.opis.delivery =
warehouse.opis.deliveryCreate.title =
warehouse.opis.deliveryUpdate.title =
warehouse.opis.returnUndelivered =
warehouse.opis.returnUndeliveredCreate.title =
warehouse.opis.returnUndeliveredUpdate.title =
# c\u043A\u043B\u0430\u0434 - \u043E\u043F\u0438\u0441\u044C
warehouse.opis.title = \u4ED3\u5E93\u4E1A\u52A1\u8BB0\u5F55
......
......@@ -53,6 +53,8 @@
"newCorrectionIncome": "../sked/newCorrectionIncome",
"newConsolidation": "../sked/newConsolidation",
"newAcceptance": "../sked/newAcceptance",
"newDelivery": "../sked/newDelivery",
"newReturnUndelivered": "../sked/newReturnUndelivered",
"load": "../sked/load/{{id}}",
"modify": {
"addSeal": "../seal/add",
......
<#import "/spring.ftl" as spring />
<div class="fillV fillH" ng-controller="AddDeliveryCtrl">
<div class="container fillH wrapper-cdek ">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title" ng-if="sked.documentNumber">
<strong><@spring.message "warehouse.opis.deliveryUpdate.title" /> {{sked.documentNumber}}</strong>
</div>
<div class="panel-title" ng-if="!sked.documentNumber">
<strong><@spring.message "warehouse.opis.deliveryCreate.title" /></strong>
</div>
</div>
<div class="panel-body">
<h5><@spring.message "warehouse.opis.add.operType" />: <@spring.message "warehouse.opis.delivery" /></h5>
<div class="row">
<div class="col-xs-6">
<div class="row">
<div class="col-xs-8 ">
<div class="row">
<div style="height:22px">
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.date" />:</label>
<div class="col-xs-6">
<div class="input-group" bootstrap-datetimepicker="{format: 'DD.MM.YYYY', showClose: true}">
<input placeholder="<@spring.message "format.date.default" />" id="from" type="text" class="form-control"
datetimepicker-api="skedDateApi"
ng-model="sked.date"><span
class="input-group-addon" ng-click="skedDateApi.toggle()"><i
class="glyphicon glyphicon-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.branch" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setBranch"
initial-value="sked.branch"
remote-api-handler="catalogs.searchBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true">
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.filter.warehouse" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setWarehouse"
initial-value="sked.warehouse"
remote-api-handler="catalogs.searchWarehouse"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true">
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.process" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setEmployeeIn"
initial-value="sked.employeeIn"
remote-api-handler="searchEmployeeByBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true"
>
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.opis.edit.passed" />:</label>
<div class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setEmployeeOut"
initial-value="sked.employeeOut"
remote-api-handler="searchEmployeeByBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
>
</div>
</div>
</div>
</div>
<div class="col-xs-4">
<div class="row">
<label class="col-xs-6"><@spring.message "warehouse.opis.add.numberSeals" /></label>
</div>
<div class="row">
<div class="col-xs-12">
<form class="form-inline">
<div class="form-group">
<input type="text" ng-pattern="/([1-9]){1}(\d){9}/" maxlength="10" class="form-control" ng-model="sealNumber" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">
</div>
<button type="submit" class="btn btn-primary" ng-click="addSeal(sealNumber)" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut || !sealNumber"><span class="glyphicon glyphicon-plus"
aria-hidden="true"></span></button>
</form>
</div>
</div>
<div class="rowtop5 fillV fillH">
<div class="cell fillV fillH">
<ag-grid-ext api="sealListApi" shared-object="this" style="height: 130px;" class="ag-fresh" list-get-url="{{config.string('url.seal.list') + '/' + sked.uuid}}">
<column header-name="<@spring.message "warehouse.seals.numberSeals" />"
field="sealNumber"></column>
<column header-name="" field="" width="30">
<cell-renderer>
<button class="btn btn-lnk btn-sm"
ng-click="sharedObject.deleteSeal(data)" ng-disabled="sked.deleted==true || sked.dateClose!=null ">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</cell-renderer>
</column>
</ag-grid-ext>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.note" />:</label>
<div class="col-xs-12">
<textarea rows="3" class="form-control" ng-model="sked.description['${lang}']"/>
</div>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<strong><@spring.message "warehouse.opis.add.scan" /></strong>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-offset-4 col-xs-6">
<form class="form-inline">
<div class="form-group">
<label><@spring.message "warehouse.scan.numberOrder" />:</label>
<input type="text" class="form-control" ng-model="orderNumber" maxlength="20"
ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">
</div>
<button type="submit" class="btn btn-primary" ng-click="addOrder(orderNumber)"
ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut"><span
class="glyphicon glyphicon-plus"
aria-hidden="true"></span></button>
</form>
</div>
</div>
<div class='form-group'>
<#--<label for="errors" class="small"><@spring.message "warehouse.scan.errors" /></label>-->
<div class="scan-logs">
<p ng-repeat="alert in scanLogs" ng-class="alert.type">{{alert.msg}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-11">
<h4><strong><@spring.message "warehouse.orders" /></strong></h4>
</div>
<div class="col-xs-1">
<button type="button" class="btn btn-primary pull-right" ng-click="orderListApi.reload()">
<span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-primary pull-right" ng-click="downloadOrdersAsCsv()">
<i class="fa fa-print" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="row-cdek fillV fillH">
<div class="cell-cdek fillV fillH">
<ag-grid-ext shared-object="this" api="orderListApi" shared-object="this" class="ag-fresh fillH"
get-row-height="getRowHeightOrder" list-get-url="{{config.string('url.order.list') + '/'+sked.documentType+'/'+sked.uuid}}" style="height: 100%;" >
<column header-name="<@spring.message "warehouse.orders.numberOrder" />"
field="orderNumber"></column>
<column header-name="<@spring.message "warehouse.orders.factWeight" />"
field="factWeight" width="70"></column>
<column header-name="<@spring.message "template.date" />"
field="date"></column>
<column header-name="<@spring.message "warehouse.orders.branchFrom" />"
field="branchFrom"></column>
<column header-name="<@spring.message "warehouse.orders.branchTo" />"
field="branchTo"></column>
<column value-getter="ctx.sharedObject.cargoPlaceCountValueGetter(data.cargoPlaceCount, data.itemCount)"
header-name="<@spring.message "warehouse.orders.cargoPlaceCount" />" width="70">
<cell-renderer>
{{data.cargoPlaceCount}} ({{data.itemCount}})
</cell-renderer>
<footer-renderer>
{{data.cargoPlaceCount}} ({{data.itemCount}})
</footer-renderer>
</column>
<column header-name="<@spring.message "warehouse.orders.problems" />"
value-getter="ctx.sharedObject.problemDescriptionValueGetter(data.problemDescription, data.problemCodes)">
<cell-renderer>
<div class="problems" ng-bind-html="sharedObject.getProblemsString(data)"></div>
</cell-renderer>
</column>
<column header-name="" field="" width="40">
<cell-renderer>
<button class="btn btn-default btn-sm"
ng-click="sharedObject.deleteOrder(data)">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</cell-renderer>
</column>
</ag-grid-ext>
</div>
</div>
<div class="row top10 bottom15">
<div class="col-xs-12 text-center" ng-show="!sked.uuid">
<button type="button" class="pull btn btn-primary" ng-click="saveSked()" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.save" />&nbsp;&nbsp;&nbsp;&nbsp;</button>
<a type="button" class="btn btn-primary" ng-href="#/{{language}}">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.cancel" />&nbsp;&nbsp;&nbsp;&nbsp;</a>
</div>
<div class="col-xs-12 text-center" ng-show="sked.uuid">
<button type="button" class="pull btn btn-primary" ng-click="updateSked()">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.save" />&nbsp;&nbsp;&nbsp;&nbsp;</button>
<a type="button" class="btn btn-primary" ng-href="#/list/{{language}}/{{sked.uuid}}">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.back" />&nbsp;&nbsp;&nbsp;&nbsp;</a>
</div>
</div>
</div>
</div>
\ No newline at end of file
<#import "/spring.ftl" as spring />
<div class="fillV fillH" ng-controller="AddReturnUndelivered">
<div class="container fillH wrapper-cdek ">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title" ng-if="sked.documentNumber">
<strong><@spring.message "warehouse.opis.returnUndeliveredUpdate.title" /> {{sked.documentNumber}}</strong>
</div>
<div class="panel-title" ng-if="!sked.documentNumber">
<strong><@spring.message "warehouse.opis.returnUndeliveredCreate.title" /></strong>
</div>
</div>
<div class="panel-body">
<h5><@spring.message "warehouse.opis.add.operType" />: <@spring.message "warehouse.opis.returnUndelivered" /></h5>
<div class="row">
<div class="col-xs-6">
<div class="row">
<div class="col-xs-8 ">
<div class="row">
<div style="height:22px">
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.date" />:</label>
<div class="col-xs-6">
<div class="input-group" bootstrap-datetimepicker="{format: 'DD.MM.YYYY', showClose: true}">
<input placeholder="<@spring.message "format.date.default" />" id="from" type="text" class="form-control"
datetimepicker-api="skedDateApi"
ng-model="sked.date"><span
class="input-group-addon" ng-click="skedDateApi.toggle()"><i
class="glyphicon glyphicon-calendar"></i></span>
</div>
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.branch" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setBranch"
initial-value="sked.branch"
remote-api-handler="catalogs.searchBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true">
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.filter.warehouse" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setWarehouse"
initial-value="sked.warehouse"
remote-api-handler="catalogs.searchWarehouse"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true">
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.process" />:</label>
<div
class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setEmployeeIn"
initial-value="sked.employeeIn"
remote-api-handler="searchEmployeeByBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
disable-input="true"
>
</div>
</div>
</div>
<div class="row top5">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "warehouse.opis.edit.passed" />:</label>
<div class="col-xs-7"
angucomplete-alt
placeholder=""
pause="0"
selected-object="setEmployeeOut"
initial-value="sked.employeeOut"
remote-api-handler="searchEmployeeByBranch"
title-field="name"
minlength="1"
input-class="form-control form-control-small"
match-class="highlight"
>
</div>
</div>
</div>
</div>
<div class="col-xs-4">
<div class="row">
<label class="col-xs-6"><@spring.message "warehouse.opis.add.numberSeals" /></label>
</div>
<div class="row">
<div class="col-xs-12">
<form class="form-inline">
<div class="form-group">
<input type="text" ng-pattern="/([1-9]){1}(\d){9}/" maxlength="10" class="form-control" ng-model="sealNumber" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">
</div>
<button type="submit" class="btn btn-primary" ng-click="addSeal(sealNumber)" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut || !sealNumber"><span class="glyphicon glyphicon-plus"
aria-hidden="true"></span></button>
</form>
</div>
</div>
<div class="rowtop5 fillV fillH">
<div class="cell fillV fillH">
<ag-grid-ext api="sealListApi" shared-object="this" style="height: 130px;" class="ag-fresh" list-get-url="{{config.string('url.seal.list') + '/' + sked.uuid}}">
<column header-name="<@spring.message "warehouse.seals.numberSeals" />"
field="sealNumber"></column>
<column header-name="" field="" width="30">
<cell-renderer>
<button class="btn btn-lnk btn-sm"
ng-click="sharedObject.deleteSeal(data)" ng-disabled="sked.deleted==true || sked.dateClose!=null ">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</cell-renderer>
</column>
</ag-grid-ext>
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<label class="control-label col-xs-5"><@spring.message "template.note" />:</label>
<div class="col-xs-12">
<textarea rows="3" class="form-control" ng-model="sked.description['${lang}']"/>
</div>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<strong><@spring.message "warehouse.opis.add.scan" /></strong>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-offset-4 col-xs-6">
<form class="form-inline">
<div class="form-group">
<label><@spring.message "warehouse.scan.numberOrder" />:</label>
<input type="text" class="form-control" ng-model="orderNumber" maxlength="20"
ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">
</div>
<button type="submit" class="btn btn-primary" ng-click="addOrder(orderNumber)"
ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut"><span
class="glyphicon glyphicon-plus"
aria-hidden="true"></span></button>
</form>
</div>
</div>
<div class='form-group'>
<#--<label for="errors" class="small"><@spring.message "warehouse.scan.errors" /></label>-->
<div class="scan-logs">
<p ng-repeat="alert in scanLogs" ng-class="alert.type">{{alert.msg}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-11">
<h4><strong><@spring.message "warehouse.orders" /></strong></h4>
</div>
<div class="col-xs-1">
<button type="button" class="btn btn-primary pull-right" ng-click="orderListApi.reload()">
<span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
</button>
<button type="button" class="btn btn-primary pull-right" ng-click="downloadOrdersAsCsv()">
<i class="fa fa-print" aria-hidden="true"></i>
</button>
</div>
</div>
<div class="row-cdek fillV fillH">
<div class="cell-cdek fillV fillH">
<ag-grid-ext shared-object="this" api="orderListApi" shared-object="this" class="ag-fresh fillH"
get-row-height="getRowHeightOrder" list-get-url="{{config.string('url.order.list') + '/'+sked.documentType+'/'+sked.uuid}}" style="height: 100%;" >
<column header-name="<@spring.message "warehouse.orders.numberOrder" />"
field="orderNumber"></column>
<column header-name="<@spring.message "warehouse.orders.factWeight" />"
field="factWeight" width="70"></column>
<column header-name="<@spring.message "template.date" />"
field="date"></column>
<column header-name="<@spring.message "warehouse.orders.branchFrom" />"
field="branchFrom"></column>
<column header-name="<@spring.message "warehouse.orders.branchTo" />"
field="branchTo"></column>
<column value-getter="ctx.sharedObject.cargoPlaceCountValueGetter(data.cargoPlaceCount, data.itemCount)"
header-name="<@spring.message "warehouse.orders.cargoPlaceCount" />" width="70">
<cell-renderer>
{{data.cargoPlaceCount}} ({{data.itemCount}})
</cell-renderer>
<footer-renderer>
{{data.cargoPlaceCount}} ({{data.itemCount}})
</footer-renderer>
</column>
<column header-name="<@spring.message "warehouse.orders.problems" />"
value-getter="ctx.sharedObject.problemDescriptionValueGetter(data.problemDescription, data.problemCodes)">
<cell-renderer>
<div class="problems" ng-bind-html="sharedObject.getProblemsString(data)"></div>
</cell-renderer>
</column>
<column header-name="" field="" width="40">
<cell-renderer>
<button class="btn btn-default btn-sm"
ng-click="sharedObject.deleteOrder(data)">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</cell-renderer>
</column>
</ag-grid-ext>
</div>
</div>
<div class="row top10 bottom15">
<div class="col-xs-12 text-center" ng-show="!sked.uuid">
<button type="button" class="pull btn btn-primary" ng-click="saveSked()" ng-disabled="!sked.warehouse || !sked.employeeIn || !sked.employeeOut">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.save" />&nbsp;&nbsp;&nbsp;&nbsp;</button>
<a type="button" class="btn btn-primary" ng-href="#/{{language}}">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.cancel" />&nbsp;&nbsp;&nbsp;&nbsp;</a>
</div>
<div class="col-xs-12 text-center" ng-show="sked.uuid">
<button type="button" class="pull btn btn-primary" ng-click="updateSked()">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.save" />&nbsp;&nbsp;&nbsp;&nbsp;</button>
<a type="button" class="btn btn-primary" ng-href="#/list/{{language}}/{{sked.uuid}}">&nbsp;&nbsp;&nbsp;&nbsp;<@spring.message "template.back" />&nbsp;&nbsp;&nbsp;&nbsp;</a>
</div>
</div>
</div>
</div>
\ No newline at end of file
......@@ -8,4 +8,6 @@
<script src="../../warehouse-angular/application/add_correction_income.js"></script>
<script src="../../warehouse-angular/application/add_consolidation.js"></script>
<script src="../../warehouse-angular/application/add_acceptance.js"></script>
<script src="../../warehouse-angular/application/add_delivery.js"></script>
<script src="../../warehouse-angular/application/add_return_undelivered.js"></script>
</@master.index>
......@@ -70,6 +70,12 @@ angular
newCorrectionIncome: function() {
return $http.post(config.string('url.sked.newCorrectionIncome'));
},
newDelivery: function() {
return $http.post(config.string('url.sked.newDelivery'));
},
newReturnUndelivered: function() {
return $http.post(config.string('url.sked.newReturnUndelivered'));
},
newConsolidation: function() {
return $http.post(config.string('url.sked.newConsolidation'));
},
......
......@@ -254,10 +254,13 @@ input.ng-invalid-has-errors {
width: 100%;
}
.documentTypeFilterWrapper{
margin-left:-100px;
}
.documentTypeFilter {
height:0px;
overflow:visible;
padding-left:10px;
height:100px;
overflow-y:scroll;
z-index:9999999999;
}
......
app.controller('AddDeliveryCtrl', function($scope, $routeParams, $timeout, $location, config, dialogs, skedService, catalogs) {
$scope.$parent.child = $scope;
$scope.config = config;
$timeout(function () {
skedService.initFloatingRow($scope.orderListApi.gridOptions);
});
$scope.setWarehouse=function(value){
$scope.sked.warehouse=value? value.originalObject:null;
};
$scope.setEmployeeIn=function(value){
$scope.sked.employeeIn=value? value.originalObject:null;
};
$scope.setEmployeeOut=function(value){
$scope.sked.employeeOut=value? value.originalObject:null;
};
$scope.searchEmployeeByBranch=function(keyword){
return catalogs.searchEmployeeByBranch(keyword, $scope.sked.branch.code)
};
/**
* params- параметры для экспорта.
* По умолчанию заданы два параметра columnSeparator и skipHeader
*/
$scope.downloadOrdersAsCsv = function(params) {
$scope.orderListApi.exportDataAsCsv(params);
};
if ($routeParams.skedId) {
skedService.loadSked($routeParams.skedId).then(function successCallback(response) {
$scope.sked = response.data;
$timeout(function() {
$scope.orderListApi.reload();
$scope.sealListApi.reload();
});
}, function errorCallback(response) {
// Ignore
});
} else {
skedService.newDelivery().then(function successCallback(response) {
$scope.sked = response.data;
});
}
});
app.controller('AddReturnUndelivered', function($scope, $routeParams, $timeout, $location, config, dialogs, skedService, catalogs) {
$scope.$parent.child = $scope;
$scope.config = config;
$timeout(function () {
skedService.initFloatingRow($scope.orderListApi.gridOptions);
});
$scope.setWarehouse=function(value){
$scope.sked.warehouse=value? value.originalObject:null;
};
$scope.setEmployeeIn=function(value){
$scope.sked.employeeIn=value? value.originalObject:null;
};
$scope.setEmployeeOut=function(value){
$scope.sked.employeeOut=value? value.originalObject:null;
};
$scope.searchEmployeeByBranch=function(keyword){
return catalogs.searchEmployeeByBranch(keyword, $scope.sked.branch.code)
};
/**
* params- параметры для экспорта.
* По умолчанию заданы два параметра columnSeparator и skipHeader
*/
$scope.downloadOrdersAsCsv = function(params) {
$scope.orderListApi.exportDataAsCsv(params);
};
if ($routeParams.skedId) {
skedService.loadSked($routeParams.skedId).then(function successCallback(response) {
$scope.sked = response.data;
$timeout(function() {
$scope.orderListApi.reload();
$scope.sealListApi.reload();
});
}, function errorCallback(response) {
// Ignore
});
} else {
skedService.newDelivery().then(function successCallback(response) {
$scope.sked = response.data;
});
}
});
......@@ -101,6 +101,46 @@ app.config(function($routeProvider, $provide, $httpProvider) {
return config.promise;
}
}
}).when('/add_delivery/:language', {
templateUrl : function (tElement, tAttrs) {
return './add_delivery?language=' + tElement.language;
},
controller : 'WarehouseCommonCtrl',
resolve:{
'ConfigLoad':function(config) {
return config.promise;
}
}
}).when('/edit_delivery/:language/:skedId', {
templateUrl : function (tElement, tAttrs) {
return './add_delivery?language=' + tElement.language;
},
controller : 'WarehouseCommonCtrl',
resolve:{
'ConfigLoad':function(config) {
return config.promise;
}
}
}).when('/add_return_undelivered/:language', {
templateUrl : function (tElement, tAttrs) {
return './add_return_undelivered?language=' + tElement.language;
},
controller : 'WarehouseCommonCtrl',
resolve:{
'ConfigLoad':function(config) {
return config.promise;
}
}
}).when('/edit_return_undelivered/:language/:skedId', {
templateUrl : function (tElement, tAttrs) {
return './add_return_undelivered?language=' + tElement.language;
},
controller : 'WarehouseCommonCtrl',
resolve:{
'ConfigLoad':function(config) {
return config.promise;
}
}
});
$(document).unbind("keypress");
});
......
......@@ -7,7 +7,9 @@ app.controller('WarehouseCtrl',function ($scope, $routeParams,
'PRIME_INCOME': 'edit_inventory',
'CORRECTION_INCOME': 'edit_correction_income',
'ACCEPTANCE': 'edit_acceptance',
'CONSOLIDATION': 'edit_consolidation'
'CONSOLIDATION': 'edit_consolidation',
'DELIVERY': 'edit_delivery',
'RETURN_UNDELIVERED': 'edit_return_undelivered'
};
$scope.syncProblem = {};
$scope.catalogs = catalogs;
......@@ -176,6 +178,12 @@ app.controller('WarehouseCtrl',function ($scope, $routeParams,
case "ACCEPTANCE":
documentTypedCloseTitle = config.message('warehouse.opis.closeAcceptance.title');
break;
case "DELIVERY":
documentTypedCloseTitle = config.message('warehouse.opis.closeDelivery.title');
break;
case "RETUN_UNDELIVERED":
documentTypedCloseTitle = config.message('warehouse.opis.closeReturnUndelivered.title');
break;
}
dialogs.confirmation(documentTypedCloseTitle + " " + ($scope.skedListApi.single.documentNumber || "") + "?").then(function () {
skedService.closeSked($scope.skedListApi.single).then(function successCallback(response) {
......
......@@ -20,5 +20,8 @@ public enum DocumentType {
DECONSOLIDATION, //документ Расконсолидации
CORRECTION_INCOME, //Документ Приход-Коррекция
CORRECTION_SHIPMENT, //Документ Расход-Коррекция
SORTER_INCOME //Документ Приход от сортера
SORTER_INCOME, //Документ Приход от сортера
DELIVERY, //Документ Выдача на доставку
RETURN_UNDELIVERED //Документ Возврат недоставленного
}
......@@ -21,6 +21,7 @@ import com.cdek.warehouse.services.correction.CorrectionManager;
import com.cdek.warehouse.services.document.*;
import com.cdek.warehouse.services.operation.*;
import com.cdek.warehouse.services.sync.SyncDocumentService;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
......@@ -100,6 +101,14 @@ public class WarehouseServiceImpl implements WarehouseService {
sked = createOrUpdateSkedCorrectionIncome(sked, userCode);
break;
}
case DELIVERY: { //опись является документом выдача на доставку
sked = createOrUpdateSkedDelivery(sked, userCode);
break;
}
case RETURN_UNDELIVERED: { //опись является документом возврат недоставленного
sked = createOrUpdateSkedReturnUndelivered(sked, userCode);
break;
}
default:
throw new WarehouseServiceException(SKED_TYPE_UNKNOWN, "Unknown Sked: operType[" + sked.getOperType() + "] aimType[" + sked.getAimType() + "]");
}
......@@ -434,6 +443,21 @@ public class WarehouseServiceImpl implements WarehouseService {
}
}
private Sked createOrUpdateSkedDelivery(Sked sked, String userCode) {
//TODO mock for interface
ObjectIdGenerators.UUIDGenerator generator = new ObjectIdGenerators.UUIDGenerator();
sked.setUuid(generator.generateId(sked).toString());
return sked;
}
private Sked createOrUpdateSkedReturnUndelivered(Sked sked, String userCode) {
//TODO mock for interface
ObjectIdGenerators.UUIDGenerator generator = new ObjectIdGenerators.UUIDGenerator();
sked.setUuid(generator.generateId(sked).toString());
return sked;
}
private Sked createOrUpdateSkedAcceptance(Sked sked, String userCode) {
//Опись без идентификатора, значит создаем новую Опись и Документ Приемки
if (sked.getUuid() == null) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment