Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
T
traffic-front
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wangxiaoming
traffic-front
Commits
b75d1cec
Commit
b75d1cec
authored
Mar 01, 2019
by
zhkwei
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev_mysql' into dev_mysql
parents
355c5d38
f09fa1dd
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
1091 additions
and
365 deletions
+1091
-365
DataImportController.java
...ava/pwc/taxtech/atms/controller/DataImportController.java
+7
-0
TemplateController.java
.../java/pwc/taxtech/atms/controller/TemplateController.java
+2
-9
TemplateGroupController.java
.../pwc/taxtech/atms/controller/TemplateGroupController.java
+13
-0
DataProcessParam.java
...ava/pwc/taxtech/atms/dto/dataimport/DataProcessParam.java
+19
-0
EbsApiServiceImpl.java
...java/pwc/taxtech/atms/service/impl/EbsApiServiceImpl.java
+0
-0
TemplateGroupServiceImpl.java
...c/taxtech/atms/service/impl/TemplateGroupServiceImpl.java
+22
-2
EbsApiServiceImplTest.java
.../pwc/taxtech/atms/service/impl/EbsApiServiceImplTest.java
+0
-0
TemplateExtendsMapper.xml
...es/pwc/taxtech/atms/dao/extends/TemplateExtendsMapper.xml
+2
-2
module-part2.js
atms-web/src/main/webapp/Scripts/module-part2.js
+18
-0
vat.json
atms-web/src/main/webapp/app-resources/i18n/en-us/vat.json
+12
-2
vat.json
atms-web/src/main/webapp/app-resources/i18n/zh-CN/vat.json
+42
-57
declaration-form-configuration.ctrl.js
...nFormConfiguration/declaration-form-configuration.ctrl.js
+75
-60
declaration-form-configuration.html
...tionFormConfiguration/declaration-form-configuration.html
+8
-8
declaration-form-configuration.less
...tionFormConfiguration/declaration-form-configuration.less
+3
-3
edit-template-modal.ctrl.js
.../controls/edit-template-modal/edit-template-modal.ctrl.js
+0
-0
edit-template-modal.html
...mon/controls/edit-template-modal/edit-template-modal.html
+0
-0
edit-template-modal.js
...ommon/controls/edit-template-modal/edit-template-modal.js
+31
-30
edit-template-modal.less
...mon/controls/edit-template-modal/edit-template-modal.less
+98
-93
dataProcessService.js
.../main/webapp/app/common/vatservices/dataProcessService.js
+89
-84
templateGroup.svc.js
...c/main/webapp/app/common/webservices/templateGroup.svc.js
+1
-1
import-log.ctrl.js
...n/webapp/app/dataImport/log/import-log/import-log.ctrl.js
+2
-2
process-log.ctrl.js
...webapp/app/dataImport/log/process-log/process-log.ctrl.js
+238
-0
process-log.html
...in/webapp/app/dataImport/log/process-log/process-log.html
+23
-0
process-log.js
...main/webapp/app/dataImport/log/process-log/process-log.js
+26
-0
process-log.less
...in/webapp/app/dataImport/log/process-log/process-log.less
+343
-0
vat-import-layout.ctrl.js
...pp/vat/import/vat-import-layout/vat-import-layout.ctrl.js
+3
-3
vat-preview-cash-flow.ctrl.js
...eview/vat-preview-cash-flow/vat-preview-cash-flow.ctrl.js
+7
-2
vat-preview-cash-flow.html
.../preview/vat-preview-cash-flow/vat-preview-cash-flow.html
+1
-1
vat-preview-certified-invoices-list.ctrl.js
...invoices-list/vat-preview-certified-invoices-list.ctrl.js
+2
-2
vat-preview-invoice-data.ctrl.js
...vat-preview-invoice-data/vat-preview-invoice-data.ctrl.js
+1
-1
vat-preview-invoice-record.ctrl.js
...preview-invoice-record/vat-preview-invoice-record.ctrl.js
+1
-1
vat-preview-red-letter-info-tab.ctrl.js
...d-letter-info-tab/vat-preview-red-letter-info-tab.ctrl.js
+2
-2
No files found.
atms-api/src/main/java/pwc/taxtech/atms/controller/DataImportController.java
View file @
b75d1cec
...
...
@@ -9,6 +9,7 @@ import pwc.taxtech.atms.common.message.ErrorMessage;
import
pwc.taxtech.atms.dpo.PagingDto
;
import
pwc.taxtech.atms.dto.*
;
import
pwc.taxtech.atms.dto.dataimport.DataImportParam
;
import
pwc.taxtech.atms.dto.dataimport.DataProcessParam
;
import
pwc.taxtech.atms.dto.input.CamelPagingResultDto
;
import
pwc.taxtech.atms.dto.vatdto.TrialBalanceDto
;
import
pwc.taxtech.atms.dto.vatdto.TrialBalanceParam
;
...
...
@@ -218,6 +219,12 @@ public class DataImportController extends BaseController {
return
new
CamelPagingResultDto
<>(
dataImportService
.
displayImportLog
(
param
));
}
/* @ResponseBody
@RequestMapping(value = "displayProcessLog", method = RequestMethod.POST)
public CamelPagingResultDto<DataProcessLogDto> displayProcessLog(@RequestBody DataProcessParam param) {
return new CamelPagingResultDto<>(dataImportService.displayProcessLog(param));
}*/
@ResponseBody
@RequestMapping
(
value
=
"callExtractFinancialData"
,
method
=
RequestMethod
.
POST
)
public
OperationResultDto
callExtractFinancialData
(
@RequestBody
DataExtractParam
dataExtractParam
)
{
...
...
atms-api/src/main/java/pwc/taxtech/atms/controller/TemplateController.java
View file @
b75d1cec
...
...
@@ -46,7 +46,7 @@ import java.util.List;
@RestController
@RequestMapping
(
value
=
"api/v1/template"
)
public
class
TemplateController
extends
BaseController
implements
ServletContextAware
{
public
class
TemplateController
extends
BaseController
{
private
ServletContext
servletContext
;
...
...
@@ -242,7 +242,6 @@ public class TemplateController extends BaseController implements ServletContext
@RequestMapping
(
value
=
"file/downloadTemplate"
,
method
=
RequestMethod
.
GET
)
public
void
fileDownload
(
@RequestParam
Integer
fileType
,
@RequestParam
(
required
=
false
)
Integer
serviceType
,
HttpServletResponse
response
){
//获取网站部署路径(通过ServletContext对象),用于确定下载文件位置,从而实现下载
String
path
=
servletContext
.
getRealPath
(
"/"
)+
"\\WEB-INF\\classes"
;
String
fileName
=
""
;
if
(
serviceType
==
null
){
fileName
=
getFileName
(
fileType
);
...
...
@@ -252,9 +251,8 @@ public class TemplateController extends BaseController implements ServletContext
response
.
setContentType
(
"multipart/form-data"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;fileName="
+
fileName
+
".xlsx"
);
ServletOutputStream
out
;
File
file
=
new
File
(
path
+
"\\document\\DataImport\\"
+
fileName
+
".xlsx"
);
try
{
FileInputStream
inputStream
=
new
FileInputStream
(
file
);
InputStream
inputStream
=
this
.
getClass
().
getResourceAsStream
(
"/document/DataImport/"
+
fileName
+
".xlsx"
);
out
=
response
.
getOutputStream
();
int
b
=
0
;
byte
[]
buffer
=
new
byte
[
512
];
...
...
@@ -314,9 +312,4 @@ public class TemplateController extends BaseController implements ServletContext
return
null
;
}
@Override
public
void
setServletContext
(
ServletContext
servletContext
)
{
this
.
servletContext
=
servletContext
;
}
}
atms-api/src/main/java/pwc/taxtech/atms/controller/TemplateGroupController.java
View file @
b75d1cec
...
...
@@ -156,4 +156,17 @@ public class TemplateGroupController {
return
OperationResultDto
.
error
(
ErrorMessage
.
SystemError
);
}
@RequestMapping
(
value
=
"withoutTemplate"
,
method
=
RequestMethod
.
POST
)
public
@ResponseBody
OperationResultDto
withoutTemplate
(
@RequestBody
TemplateGroupDto
templateGroupDto
)
{
try
{
templateGroupService
.
addTemplateGroupWithoutTemplate
(
templateGroupDto
);
return
OperationResultDto
.
success
();
}
catch
(
ServiceException
e
)
{
return
OperationResultDto
.
error
(
e
.
getMessage
());
}
catch
(
Exception
e
)
{
logger
.
error
(
"withoutTemplate error."
,
e
);
}
return
OperationResultDto
.
error
(
ErrorMessage
.
SystemError
);
}
}
atms-api/src/main/java/pwc/taxtech/atms/dto/dataimport/DataProcessParam.java
0 → 100644
View file @
b75d1cec
package
pwc
.
taxtech
.
atms
.
dto
.
dataimport
;
import
pwc.taxtech.atms.dto.input.CamelPagingDto
;
public
class
DataProcessParam
{
private
CamelPagingDto
pageInfo
;
//后续添加查询条件
public
CamelPagingDto
getPageInfo
()
{
return
this
.
pageInfo
;
}
public
void
setPageInfo
(
CamelPagingDto
pageInfo
)
{
this
.
pageInfo
=
pageInfo
;
}
}
atms-api/src/main/java/pwc/taxtech/atms/service/impl/EbsApiServiceImpl.java
View file @
b75d1cec
This diff is collapsed.
Click to expand it.
atms-api/src/main/java/pwc/taxtech/atms/service/impl/TemplateGroupServiceImpl.java
View file @
b75d1cec
...
...
@@ -38,10 +38,8 @@ import pwc.taxtech.atms.entity.TemplateGroup;
import
pwc.taxtech.atms.entity.TemplateGroupExample
;
import
pwc.taxtech.atms.exception.ServiceException
;
import
pwc.taxtech.atms.vat.dao.PeriodDataSourceMapper
;
import
pwc.taxtech.atms.vat.entity.PeriodCellData
;
import
pwc.taxtech.atms.vat.entity.PeriodDataSource
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.InputStream
;
import
java.math.BigDecimal
;
...
...
@@ -527,6 +525,28 @@ public class TemplateGroupServiceImpl extends AbstractService {
}
@Transactional
public
void
addTemplateGroupWithoutTemplate
(
TemplateGroupDto
templateGroupDto
)
throws
ServiceException
{
List
<
TemplateGroup
>
groupList
=
templateGroupDao
.
getByGroupName
(
templateGroupDto
.
getName
());
if
(
CollectionUtils
.
isNotEmpty
(
groupList
))
{
throw
new
ServiceException
(
TemplateMessage
.
TemplateGroupNameExist
);
}
try
{
TemplateGroup
templateGroup
=
new
TemplateGroup
();
CommonUtils
.
copyProperties
(
templateGroupDto
,
templateGroup
);
Long
newGroupId
=
distributedIdService
.
nextId
();
Date
now
=
new
Date
();
templateGroup
.
setId
(
newGroupId
);
templateGroup
.
setCreateTime
(
now
);
templateGroup
.
setUpdateTime
(
now
);
templateGroup
.
setName
(
templateGroupDto
.
getName
());
templateGroupMapper
.
insertSelective
(
templateGroup
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"addTemplateGroupWithoutTemplate error."
,
e
);
throw
new
ServiceException
(
ErrorMessage
.
SystemError
);
}
}
private
List
<
CellTemplateConfig
>
getByTemplateId
(
Long
id
)
{
CellTemplateConfigExample
example
=
new
CellTemplateConfigExample
();
CellTemplateConfigExample
.
Criteria
criteria
=
example
.
createCriteria
();
...
...
atms-api/src/test/java/pwc/taxtech/atms/service/impl/EbsApiServiceImplTest.java
View file @
b75d1cec
This diff is collapsed.
Click to expand it.
atms-dao/src/main/resources/pwc/taxtech/atms/dao/extends/TemplateExtendsMapper.xml
View file @
b75d1cec
...
...
@@ -21,8 +21,8 @@
<select
id=
"getTemplateUniqDtosByTemplateAndTemplateGroup"
parameterType=
"map"
resultMap=
"TemplateUniqDto"
>
SELECT
P.id as ID,
p
.code as Code,
p
.name as Name,
P
.code as Code,
P
.name as Name,
P.report_type as ReportType,
Q.id AS TEMPLATE_GROUP_ID,
Q.name AS TEMPLATE_GROUP_NAME,
...
...
atms-web/src/main/webapp/Scripts/module-part2.js
View file @
b75d1cec
...
...
@@ -1420,6 +1420,24 @@ var dataImpModule = angular.module('app.dataImp', ['ui.grid', 'ui.router','ui.gr
sticky
:
true
});
$stateProvider
.
state
({
name
:
'recordProcessLog'
,
url
:
"/dataImportLog/dataProcessingCheck"
,
dsr
:
true
,
views
:
{
'importContent'
:
{
controller
:
[
'$scope'
,
'$state'
,
'appTranslation'
,
function
(
$scope
,
$state
,
appTranslation
)
{
$scope
.
state
=
$state
;
appTranslation
.
load
([
appTranslation
.
appPart
]);
}],
template
:
'<process-log></process-log>'
}
},
resolve
:
scriptDependencyProvider
.
createDependenciesMap
(
scriptDependencyProvider
.
dataImp
),
sticky
:
true
});
$stateProvider
.
state
({
name
:
'certifiedInvoicesListImportDistribution'
,
url
:
"/importDistribution/certifiedInvoicesList"
,
...
...
atms-web/src/main/webapp/app-resources/i18n/en-us/vat.json
View file @
b75d1cec
...
...
@@ -1880,6 +1880,15 @@
"extractInvoiceData"
:
"Extract Invoice Data"
,
"ExtractInvoiceDataTitle"
:
"Extract Invoice Data"
,
"TBInterCompany"
:
"Inter-Company"
,
"~MustBeEndOneApp"
:
"I Must be the End One, please!"
,
"dataValidate"
:
"data Validate"
"dataValidate"
:
"data Validate"
,
"DataProcessLog"
:
"Data Process Log"
,
"DataProcessLogTitle"
:
"Data Process Log"
,
"ValidateContent"
:
"Validate Content"
,
"ValidateResult"
:
"Validate Result"
,
"ResultMsg"
:
"Result Message"
,
"Operater"
:
"Operater"
,
"OperateTime"
:
"Operate Time"
,
"~MustBeEndOneApp"
:
"I Must be the End One, please!"
}
\ No newline at end of file
atms-web/src/main/webapp/app-resources/i18n/zh-CN/vat.json
View file @
b75d1cec
...
...
@@ -2122,6 +2122,9 @@
"SelectedOrganization"
:
"选择机构"
,
"SelectedDataType"
:
"选择数据类型"
,
"DataProcessLog"
:
"数据处理校验记录"
,
"DataProcessLogTitle"
:
"数据处理校验记录"
,
"extractFinancialData"
:
"财务数据抽取"
,
"ExtractFinancialDataTitle"
:
"财务数据抽取"
,
...
...
@@ -2147,7 +2150,7 @@
"RevenueGetOrgError"
:
"获取机构信息失败"
,
"RevenueAddSuccess"
:
"添加成功"
,
"RevenueUpdateSuccess"
:
"更新成功"
,
"dataValidate"
:
"数据校验"
,
"dataValidate"
:
"数据校验"
,
"RevDetail"
:
"收入明细"
,
"RevSearchAccountCode"
:
"科目代码"
,
"RevSearchAccountName"
:
"科目名称"
,
...
...
@@ -2173,61 +2176,43 @@
"RevDetailType"
:
"收入类型"
,
"RevDetailCategory"
:
"收入类别"
,
"RevDetailTaxOn"
:
"计税方法"
,
"RevDetail"
:
"收入明细"
,
"RevSearchAccountCode"
:
"科目代码"
,
"RevSearchAccountName"
:
"科目名称"
,
"RevSearchProfitCenterCode"
:
"利润中心代码"
,
"RevSearchProfitCenterName"
:
"利润中心名称"
,
"RevSearchProductCode"
:
"产品代码"
,
"RevSearchProductName"
:
"产品名称"
,
"RevSearchType"
:
"收入类型"
,
"RevSearchCategory"
:
"收入类别"
,
"RevSearchTaxOn"
:
"计税方法"
,
"RevDetailSearch"
:
"查询"
,
"RevDetailReset"
:
"重置"
,
"RevDetailColSerialNo"
:
"序号"
,
"RevDetailColSubject"
:
"主体"
,
"RevDetailColAccount"
:
"科目"
,
"RevDetailColProfitCenter"
:
"利润中心"
,
"RevDetailProduct"
:
"产品"
,
"RevDetailColSubjectExp"
:
"主体说明"
,
"RevDetailColAccountExp"
:
"科目说明"
,
"RevDetailColProfitCenterExp"
:
"利润中心说明"
,
"RevDetailProductExp"
:
"产品说明"
,
"RevDetailAmount"
:
"发生额"
,
"RevDetailType"
:
"收入类型"
,
"RevDetailCategory"
:
"收入类别"
,
"RevDetailTaxOn"
:
"计税方法"
,
"BillDetail"
:
"开票明细"
,
"BillEditRevenueType"
:
"编辑收入类型"
,
"BillDtlHandle"
:
"操作"
,
"BillSearchType"
:
"发票类型"
,
"BillSearchCustomer"
:
"客户名称"
,
"BillSearchProfitCenter"
:
"利润中心代码"
,
"BillSearchContent"
:
"开票内容"
,
"BillSearchDate"
:
"开票日期"
,
"BillSearchRevenueType"
:
"收入类型"
,
"BillSearchDepartment"
:
"申请部门"
,
"BillSearchTaxRate"
:
"税率"
,
"BillSearchNumber"
:
"发票号码"
,
"BillDtlSearch"
:
"查询"
,
"BillDtlReset"
:
"重置"
,
"BillDtlMoreSearch"
:
"更多查询"
,
"BillDtlShrink"
:
"收起"
,
"BillDtlColSerialNo"
:
"序号"
,
"BillDtlColSubject"
:
"开票主体"
,
"BillDtlColCustCompany"
:
"客户公司名称"
,
"BillDtlColType"
:
"发票类型"
,
"BillDtlColContent"
:
"开票内容"
,
"BillDtlColAmount"
:
"开票金额"
,
"BillDtlColTaxRate"
:
"税率"
,
"BillDtlColTaxAmount"
:
"税额"
,
"BillDtlColOANo"
:
"OA申请单号"
,
"BillDtlColDepartment"
:
"所属部门"
,
"BillDtlColDate"
:
"开票日期"
,
"BillDtlColCode"
:
"发票代码"
,
"BillDtlColNumber"
:
"发票号码"
,
"BillDtlColRevenueType"
:
"收入类型"
,
"BillDtlUpdateSuccess"
:
"更新成功"
,
"BillDetail"
:
"开票明细"
,
"BillEditRevenueType"
:
"编辑收入类型"
,
"BillDtlHandle"
:
"操作"
,
"BillSearchType"
:
"发票类型"
,
"BillSearchCustomer"
:
"客户名称"
,
"BillSearchProfitCenter"
:
"利润中心代码"
,
"BillSearchContent"
:
"开票内容"
,
"BillSearchDate"
:
"开票日期"
,
"BillSearchRevenueType"
:
"收入类型"
,
"BillSearchDepartment"
:
"申请部门"
,
"BillSearchTaxRate"
:
"税率"
,
"BillSearchNumber"
:
"发票号码"
,
"BillDtlSearch"
:
"查询"
,
"BillDtlReset"
:
"重置"
,
"BillDtlMoreSearch"
:
"更多查询"
,
"BillDtlShrink"
:
"收起"
,
"BillDtlColSerialNo"
:
"序号"
,
"BillDtlColSubject"
:
"开票主体"
,
"BillDtlColCustCompany"
:
"客户公司名称"
,
"BillDtlColType"
:
"发票类型"
,
"BillDtlColContent"
:
"开票内容"
,
"BillDtlColAmount"
:
"开票金额"
,
"BillDtlColTaxRate"
:
"税率"
,
"BillDtlColTaxAmount"
:
"税额"
,
"BillDtlColOANo"
:
"OA申请单号"
,
"BillDtlColDepartment"
:
"所属部门"
,
"BillDtlColDate"
:
"开票日期"
,
"BillDtlColCode"
:
"发票代码"
,
"BillDtlColNumber"
:
"发票号码"
,
"BillDtlColRevenueType"
:
"收入类型"
,
"BillDtlUpdateSuccess"
:
"更新成功"
,
"ValidateContent"
:
"校验内容"
,
"ValidateResult"
:
"校验结果"
,
"ResultMsg"
:
"校验信息"
,
"Operater"
:
"操作员"
,
"OperateTime"
:
"操作时间"
,
"~MustBeEndOneApp"
:
"我必须是最后一个!"
}
atms-web/src/main/webapp/app/admin/systemConfiguration/declarationFormConfiguration/declaration-form-configuration.ctrl.js
View file @
b75d1cec
...
...
@@ -120,18 +120,14 @@
defaultValue
=
find
;
$scope
.
templateGroupId
=
find
.
id
;
}
else
{
$scope
.
curTemplateGroup
=
null
;
}
}
dxControl
.
renderTemplateGroupDropDown
(
templateGroupData
,
defaultValue
);
if
(
templateGroupData
&&
templateGroupData
.
length
>
0
)
{
loadReportType
();
}
else
{
$
(
'#dx-select-template-groups'
).
dxDropDownBox
(
'instance'
).
option
(
'dataSource'
,
[]);
$
(
'#dx-select-template'
).
dxDropDownBox
(
'instance'
).
option
(
'dataSource'
,
[]);
}
loadReportType
();
});
}
};
...
...
@@ -147,39 +143,48 @@
}
};
if
(
$scope
.
curTemplateGroup
&&
$scope
.
curTemplateGroup
.
id
)
{
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
CIT
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
citReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
citReportTypeList
[
0
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
citReportTypeList
[
0
];
listTemplates
();
}
else
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
CF
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
cfReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
cfReportTypeList
[
1
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
cfReportTypeList
[
1
];
listTemplates
();
}
else
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
Others
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
citReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
citReportTypeList
[
0
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
citReportTypeList
[
0
];
listTemplates
();
}
else
{
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
'dataSource'
,
[]);
$scope
.
reportType
=
null
;
listTemplates
();
}
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
VAT
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
var
ds
=
_
.
filter
(
citReportTypeList
,
function
(
item
)
{
return
item
.
value
==
1
||
item
.
value
==
3
||
item
.
value
==
4
});
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
ds
});
$scope
.
detailReportTypeList
.
value
=
citReportTypeList
[
0
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
citReportTypeList
[
0
];
listTemplates
();
}
else
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
CIT
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
citReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
citReportTypeList
[
0
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
citReportTypeList
[
0
];
listTemplates
();
}
else
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
CF
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
cfReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
cfReportTypeList
[
1
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
cfReportTypeList
[
1
];
listTemplates
();
}
else
if
(
$scope
.
curServiceTypeId
===
enums
.
serviceType
.
Others
)
{
$scope
.
detailReportTypeList
=
angular
.
copy
(
defaultReportTypeOpt
);
$scope
.
detailReportTypeList
.
dataSource
=
new
DevExpress
.
data
.
ArrayStore
({
data
:
citReportTypeList
});
$scope
.
detailReportTypeList
.
value
=
citReportTypeList
[
0
].
name
;
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
$scope
.
detailReportTypeList
);
$scope
.
reportType
=
citReportTypeList
[
0
];
listTemplates
();
}
else
{
$
(
'#dx-select-report-type'
).
dxSelectBox
(
'instance'
).
option
(
'dataSource'
,
[]);
$scope
.
reportType
=
null
;
listTemplates
();
}
};
...
...
@@ -315,31 +320,41 @@
//加载'报表'源数据
var
listTemplates
=
function
()
{
templateGroupService
.
getTemplateList
(
$scope
.
curTemplateGroup
.
id
,
$scope
.
reportType
&&
$scope
.
reportType
.
value
).
success
(
function
(
templateData
)
{
templateData
=
_
.
filter
(
templateData
,
function
(
row
)
{
return
row
.
isActiveAssociation
;
});
if
(
$scope
.
curTemplateGroup
&&
$scope
.
curTemplateGroup
.
id
)
{
templateGroupService
.
getTemplateList
(
$scope
.
curTemplateGroup
.
id
,
$scope
.
reportType
&&
$scope
.
reportType
.
value
).
success
(
function
(
templateData
)
{
var
defaultValue
=
templateData
[
0
];
if
(
$scope
.
currentTemplate
&&
(
$scope
.
currentTemplate
.
name
||
$scope
.
currentTemplate
.
id
))
{
var
find
=
_
.
find
(
templateData
,
function
(
row
)
{
return
row
.
name
===
$scope
.
currentTemplate
.
name
||
row
.
id
===
$scope
.
currentTemplate
;
templateData
=
_
.
filter
(
templateData
,
function
(
row
)
{
return
row
.
isActiveAssociation
;
});
if
(
find
)
{
defaultValue
=
find
;
var
defaultValue
=
templateData
[
0
];
if
(
$scope
.
currentTemplate
&&
(
$scope
.
currentTemplate
.
name
||
$scope
.
currentTemplate
.
id
))
{
var
find
=
_
.
find
(
templateData
,
function
(
row
)
{
return
row
.
name
===
$scope
.
currentTemplate
.
name
||
row
.
id
===
$scope
.
currentTemplate
;
});
if
(
find
)
{
defaultValue
=
find
;
}
else
{
$scope
.
currentTemplate
=
null
;
}
}
}
$scope
.
templates
=
templateData
;
//当前组下的所有模板数据
$scope
.
templates
=
templateData
;
//当前组下的所有模板数据
dxControl
.
renderTemplateDropDown
(
templateData
,
defaultValue
);
//配置报表下拉框
if
(
templateData
&&
templateData
.
length
>
0
)
{
$scope
.
ToggleSaveAs
=
showSavebutton
();
}
});
dxControl
.
renderTemplateDropDown
(
templateData
,
defaultValue
);
//配置报表下拉框
if
(
templateData
&&
templateData
.
length
>
0
)
{
$scope
.
ToggleSaveAs
=
showSavebutton
();
}
});
}
else
{
$
(
'#dx-select-template-groups'
).
dxDropDownBox
(
'instance'
).
option
(
'dataSource'
,
[]);
$scope
.
templates
.
length
=
0
;
$scope
.
currentTemplate
=
null
;
}
};
//模板不是默认模板才可以编辑和保存
var
showSavebutton
=
function
()
{
...
...
atms-web/src/main/webapp/app/admin/systemConfiguration/declarationFormConfiguration/declaration-form-configuration.html
View file @
b75d1cec
...
...
@@ -28,15 +28,15 @@
<div
class=
"templates-top"
>
<div
class=
"form-group"
>
<span
class=
"tab-content-select-lable"
ng-show=
"curServiceTypeId !=='12'"
>
{{'IndustryColon' | translate}}
</span>
<div
id=
"dx-select-industry"
class=
"tab-content-select industry col-md-2"
ng-show=
"curServiceTypeId !=='12'"
dx-select-box=
"dataSourceIndustryList"
dx-item-alias=
"itemObj"
>
<div
id=
"dx-select-industry"
class=
"tab-content-select industry col-md-2"
ng-show=
"curServiceTypeId !=='12'"
dx-select-box=
"dataSourceIndustryList"
dx-item-alias=
"itemObj"
>
<div
data-options=
"dxTemplate: { name: 'industryItem' }"
class=
"dx-item-content dx-list-item-content"
title=
"{{itemObj.name}}"
>
{{itemObj.name}}
</div>
</div>
<span
class=
"tab-content-select-lable"
translate=
"ReportType"
ng-show=
"curServiceTypeId === '2'"
>
</span>
<div
class=
"tab-content-select reportType col-md-2"
id=
"dx-select-pay-tax-type"
ng-show=
"curServiceTypeId === '2'"
dx-select-box=
"dataSourcePayTaxTypeList"
dx-item-alias=
"itemObj"
>
<span
class=
"tab-content-select-lable"
ng-show=
"curServiceTypeId === '2'"
>
{{'Ratepayer' | translate}}:
</span>
<div
class=
"tab-content-select reportType col-md-2"
id=
"dx-select-pay-tax-type"
ng-show=
"curServiceTypeId === '2'"
dx-select-box=
"dataSourcePayTaxTypeList"
dx-item-alias=
"itemObj"
>
<div
data-options=
"dxTemplate: { name: 'filingTypeItem' }"
class=
"dx-item-content dx-list-item-content"
title=
"{{itemObj.name}}"
>
{{itemObj.name}}
</div>
...
...
@@ -44,9 +44,9 @@
<span
class=
"tab-content-select-lable"
>
{{'SelectTemplateGroup' | translate}}
</span>
<div
class=
"tab-content-select selectTemplateGroup col-md-2"
id=
"dx-select-template-groups"
>
</div>
<span
class=
"tab-content-select-lable"
translate=
"ReportType"
ng-show=
"curServiceTypeId === '6' || curServiceTypeId === '11' || curServiceTypeId === '99'"
></span>
<div
class=
"tab-content-select reportType col-md-2"
id=
"dx-select-report-type"
ng-show=
"curServiceTypeId === '6' || curServiceTypeId === '11' || curServiceTypeId === '99'"
dx-select-box=
"detailReportTypeList"
dx-item-alias=
"itemObj"
>
<span
class=
"tab-content-select-lable"
translate=
"ReportType"
ng-show=
"curServiceTypeId === '
2' ||curServiceTypeId === '
6' || curServiceTypeId === '11' || curServiceTypeId === '99'"
></span>
<div
class=
"tab-content-select reportType col-md-2"
id=
"dx-select-report-type"
ng-show=
"curServiceTypeId === '
2' ||curServiceTypeId === '
6' || curServiceTypeId === '11' || curServiceTypeId === '99'"
dx-select-box=
"detailReportTypeList"
dx-item-alias=
"itemObj"
>
<div
data-options=
"dxTemplate: { name: 'reportTypeItem' }"
class=
"dx-item-content dx-list-item-content"
title=
"{{itemObj.name}}"
>
{{itemObj.name}}
</div>
...
...
atms-web/src/main/webapp/app/admin/systemConfiguration/declarationFormConfiguration/declaration-form-configuration.less
View file @
b75d1cec
...
...
@@ -240,15 +240,15 @@
}
&.reportType {
width: 1
3
0px;
width: 1
2
0px;
}
&.selectTemplateGroup {
width:
20
0px;
width:
15
0px;
}
&.selectReport {
width:
20
0px;
width:
15
0px;
}
}
}
...
...
atms-web/src/main/webapp/app/common/controls/edit-template-modal/edit-template-modal.ctrl.js
View file @
b75d1cec
This diff is collapsed.
Click to expand it.
atms-web/src/main/webapp/app/common/controls/edit-template-modal/edit-template-modal.html
View file @
b75d1cec
This diff is collapsed.
Click to expand it.
atms-web/src/main/webapp/app/common/controls/edit-template-modal/edit-template-modal.js
View file @
b75d1cec
commonModule
.
directive
(
'editTemplateModal'
,
[
'$log'
,
function
(
$log
)
{
'use strict'
;
$log
.
debug
(
'editUserModal.ctor()...'
);
return
{
restrict
:
'E'
,
templateUrl
:
'/app/common/controls/edit-template-modal/edit-template-modal.html'
+
'?_='
+
Math
.
random
(),
replace
:
true
,
controller
:
'editTemplateModalController'
,
scope
:
{
operateType
:
'='
,
templateModel
:
'=?'
,
isUpdate
:
'=?'
,
onClosed
:
'&'
}
//,
//link: function (scope, element) {
// element.find('.selector-input').on('focus', function () {
// element.find('.org-tree-container').show();
// });
// $(document).on('click', function () {
// element.find('.org-tree-container').hide();
// }).on('click', '.org-tree-wrapper', function (e) {
// e.stopPropagation();
// });
//}
};
}
commonModule
.
directive
(
'editTemplateModal'
,
[
'$log'
,
function
(
$log
)
{
'use strict'
;
$log
.
debug
(
'editUserModal.ctor()...'
);
return
{
restrict
:
'E'
,
templateUrl
:
'/app/common/controls/edit-template-modal/edit-template-modal.html'
+
'?_='
+
Math
.
random
(),
replace
:
true
,
controller
:
'editTemplateModalController'
,
scope
:
{
operateType
:
'='
,
templateModel
:
'=?'
,
isUpdate
:
'=?'
,
onClosed
:
'&'
}
//,
//link: function (scope, element) {
// element.find('.selector-input').on('focus', function () {
// element.find('.org-tree-container').show();
// });
// $(document).on('click', function () {
// element.find('.org-tree-container').hide();
// }).on('click', '.org-tree-wrapper', function (e) {
// e.stopPropagation();
// });
//}
};
}
]);
\ No newline at end of file
atms-web/src/main/webapp/app/common/controls/edit-template-modal/edit-template-modal.less
View file @
b75d1cec
@import "~/app-resources/css/admin-theme.less";
.edit-template-modal-wrapper {
.radio-wrapper {
margin-left: 0px;
}
.control-label {
width: 100px!important;
font-weight: normal;
padding-left: 15px!important;
padding-right: 0px!important;
text-align: left;
}
.normal-label {
font-weight: normal;
padding-left: 0px!important;
padding-right: 0px!important;
input[type="radio"] {
margin: 0px 0.5em 0px 0px;
}
}
.col-sm-5,
.col-sm-7,
col-sm-9 {
padding-left: 0px!important;
padding-right: 0px!important;
}
.upload-sheet-wrapper {
padding-left: 0;
padding-right: 32px;
}
}
.edit-template-name-wrapper {
.modal-content {
width: 400px!important;
}
.must-input {
color: red;
}
.control-label {
width: 100px !important;
font-weight: normal;
padding-left: 15px;
padding-right: 0px;
text-align: left;
}
.col-sm-8 {
padding-left: 0px;
padding-right: 0px;
}
}
.margin-find{
margin: -10px -10px 10px -10px;
}
.margin-sheet{
margin: -10px -10px 10px -20px;
}
.tree-view-list {
.dx-checkbox-container {
padding: 4px;
.dx-checkbox-icon {
height: 16px;
width: 16px;
}
.dx-checkbox-icon {
font-size: 14px;
}
}
.dx-checkbox-indeterminate .dx-checkbox-icon:before {
width: 14px;
height: 14px;
left: 0px;
top: 0px;
}
}
.search-box {
margin: 6px -10px -10px -10px;
@import "~/app-resources/css/admin-theme.less";
.edit-template-modal-wrapper {
.radio-wrapper {
margin-left: 0px;
}
.control-label {
width: 100px!important;
font-weight: normal;
padding-left: 15px!important;
padding-right: 0px!important;
text-align: left;
}
.normal-label {
font-weight: normal;
padding-left: 0px!important;
padding-right: 0px!important;
input[type="radio"] {
margin: 0px 0.5em 0px 0px;
}
}
.col-sm-5,
.col-sm-7,
col-sm-9 {
padding-left: 0px!important;
padding-right: 0px!important;
}
.upload-sheet-wrapper {
padding-left: 0;
padding-right: 32px;
}
.checkbox {
margin-left: 100px;
}
}
.edit-template-name-wrapper {
.modal-content {
width: 400px!important;
}
.must-input {
color: red;
}
.control-label {
width: 100px !important;
font-weight: normal;
padding-left: 15px;
padding-right: 0px;
text-align: left;
}
.col-sm-8 {
padding-left: 0px;
padding-right: 0px;
}
}
.margin-find{
margin: -10px -10px 10px -10px;
}
.margin-sheet{
margin: -10px -10px 10px -20px;
}
.tree-view-list {
.dx-checkbox-container {
padding: 4px;
.dx-checkbox-icon {
height: 16px;
width: 16px;
}
.dx-checkbox-icon {
font-size: 14px;
}
}
.dx-checkbox-indeterminate .dx-checkbox-icon:before {
width: 14px;
height: 14px;
left: 0px;
top: 0px;
}
}
.search-box {
margin: 6px -10px -10px -10px;
}
\ No newline at end of file
atms-web/src/main/webapp/app/common/vatservices/dataProcessService.js
View file @
b75d1cec
// web service proxy for voucher
webservices
.
factory
(
'dataProcessService'
,
[
'$log'
,
'vatReportService'
,
function
(
$log
,
vatReportService
)
{
'use strict'
;
function
Job
(
serviceType
,
tplId
,
month
,
status
)
{
this
.
serviceType
=
serviceType
;
this
.
tplId
=
tplId
;
this
.
month
=
month
;
this
.
status
=
status
;
}
var
jobsArr
=
[];
//执行更新项目状态的任务
function
status_job
()
{
var
job
=
jobsArr
.
shift
();
if
(
job
)
{
//更新每个状态值
vatReportService
.
updateProcInfo
(
job
.
serviceType
,
job
.
tplId
,
job
.
month
,
job
.
status
).
then
(
function
(
resData
)
{
setTimeout
(
status_job
,
100
);
$log
.
log
(
"status_job request: "
+
job
.
tplId
+
", "
+
job
.
status
);
});
}
else
{
setTimeout
(
status_job
,
1000
);
}
}
//页面容错机制
//1. 后台查询当前项目有没有正在 处理中的报表, 间隔连续两次没查询到,证明没有处理中的,更新页面状态
var
timeInterval
=
15
*
1000
;
var
noProcItemCount
=
0
;
var
_serviceType
,
_projectId
,
_month
,
_status
,
_cb
;
function
heartBeat
()
{
vatReportService
.
heartBeat
(
_projectId
,
_month
).
then
(
function
(
resData
)
{
//if ($scope.isStartProcData) {//如果是当前处理页面
$log
.
info
(
"heartBeat......"
+
noProcItemCount
);
if
(
resData
&&
resData
.
data
.
result
)
{
//没有处理中加一次
noProcItemCount
++
;
//超过两次,就更新状态
if
(
noProcItemCount
>
3
)
{
//1. 更新项目状态,当前项目状态更改为 处理已完成
//vatReportService.updateProcInfo($scope.serviceType, vatSessionService.project.id, vatSessionService.month, getStatus('completed')).then(function (resData) {
vatReportService
.
updateProcInfo
(
_serviceType
,
_projectId
,
_month
,
_status
).
then
(
function
(
resData
)
{
//更新页面状态
_cb
();
timeInterval
=
60
*
1000
;
//60s
});
//注意后台要考虑的问题, 为了防止 signalR 的断线情况,将报表完成状态放到后台更新,前台通知更新显示而已
}
}
else
{
//表示有处理中
noProcItemCount
=
0
;
}
if
(
noProcItemCount
==
0
)
{
timeInterval
=
60
*
1000
*
3
;
//正在处理中,降低频率
}
else
{
timeInterval
=
15
*
1000
;
}
setTimeout
(
heartBeat
,
timeInterval
);
//}
});
}
return
{
startJob
:
function
()
{
setTimeout
(
status_job
,
100
);
},
addJob
:
function
(
serviceType
,
tplId
,
month
,
status
)
{
jobsArr
.
push
(
new
Job
(
serviceType
,
tplId
,
month
,
status
));
},
startHeartBeat
:
function
(
serviceType
,
projectId
,
month
,
status
,
cb
)
{
_serviceType
=
serviceType
;
_projectId
=
projectId
;
_month
=
month
;
_status
=
status
;
_cb
=
cb
;
setTimeout
(
heartBeat
,
timeInterval
);
}
};
// web service proxy for voucher
webservices
.
factory
(
'dataProcessService'
,
[
'$log'
,
'vatReportService'
,
function
(
$log
,
vatReportService
)
{
'use strict'
;
function
Job
(
serviceType
,
tplId
,
month
,
status
)
{
this
.
serviceType
=
serviceType
;
this
.
tplId
=
tplId
;
this
.
month
=
month
;
this
.
status
=
status
;
}
var
jobsArr
=
[];
//执行更新项目状态的任务
function
status_job
()
{
var
job
=
jobsArr
.
shift
();
if
(
job
)
{
//更新每个状态值
vatReportService
.
updateProcInfo
(
job
.
serviceType
,
job
.
tplId
,
job
.
month
,
job
.
status
).
then
(
function
(
resData
)
{
setTimeout
(
status_job
,
100
);
$log
.
log
(
"status_job request: "
+
job
.
tplId
+
", "
+
job
.
status
);
});
}
else
{
setTimeout
(
status_job
,
1000
);
}
}
//页面容错机制
//1. 后台查询当前项目有没有正在 处理中的报表, 间隔连续两次没查询到,证明没有处理中的,更新页面状态
var
timeInterval
=
15
*
1000
;
var
noProcItemCount
=
0
;
var
_serviceType
,
_projectId
,
_month
,
_status
,
_cb
;
function
heartBeat
()
{
vatReportService
.
heartBeat
(
_projectId
,
_month
).
then
(
function
(
resData
)
{
//if ($scope.isStartProcData) {//如果是当前处理页面
$log
.
info
(
"heartBeat......"
+
noProcItemCount
);
if
(
resData
&&
resData
.
data
.
result
)
{
//没有处理中加一次
noProcItemCount
++
;
//超过两次,就更新状态
if
(
noProcItemCount
>
3
)
{
//1. 更新项目状态,当前项目状态更改为 处理已完成
//vatReportService.updateProcInfo($scope.serviceType, vatSessionService.project.id, vatSessionService.month, getStatus('completed')).then(function (resData) {
vatReportService
.
updateProcInfo
(
_serviceType
,
_projectId
,
_month
,
_status
).
then
(
function
(
resData
)
{
//更新页面状态
_cb
();
timeInterval
=
60
*
1000
;
//60s
});
//注意后台要考虑的问题, 为了防止 signalR 的断线情况,将报表完成状态放到后台更新,前台通知更新显示而已
}
}
else
{
//表示有处理中
noProcItemCount
=
0
;
}
if
(
noProcItemCount
==
0
)
{
timeInterval
=
60
*
1000
*
3
;
//正在处理中,降低频率
}
else
{
timeInterval
=
15
*
1000
;
}
setTimeout
(
heartBeat
,
timeInterval
);
//}
});
}
return
{
startJob
:
function
()
{
setTimeout
(
status_job
,
100
);
},
addJob
:
function
(
serviceType
,
tplId
,
month
,
status
)
{
jobsArr
.
push
(
new
Job
(
serviceType
,
tplId
,
month
,
status
));
},
startHeartBeat
:
function
(
serviceType
,
projectId
,
month
,
status
,
cb
)
{
_serviceType
=
serviceType
;
_projectId
=
projectId
;
_month
=
month
;
_status
=
status
;
_cb
=
cb
;
setTimeout
(
heartBeat
,
timeInterval
);
},
displayProcessLog
:
function
(
queryParams
)
{
return
$http
.
post
(
'/DataImport/displayProcessLog'
,
queryParams
,
apiConfig
.
create
());
}
};
}]);
\ No newline at end of file
atms-web/src/main/webapp/app/common/webservices/templateGroup.svc.js
View file @
b75d1cec
...
...
@@ -12,7 +12,7 @@ webservices.factory('templateGroupService', ['$http', 'apiConfig', 'httpCacheSer
return
$http
.
post
(
'/templateGroup/addTemplateGroup'
,
templateGroup
,
apiConfig
.
create
());
},
addTemplateGroupWithoutTemplate
:
function
(
templateGroup
)
{
return
$http
.
post
(
'/templateGroup/
templateGroup/
withoutTemplate'
,
templateGroup
,
apiConfig
.
create
());
return
$http
.
post
(
'/templateGroup/withoutTemplate'
,
templateGroup
,
apiConfig
.
create
());
},
getTemplateList
:
function
(
templateGroupID
,
reportType
)
{
return
$http
.
get
(
'/template/get?templateGroupID='
+
templateGroupID
+
'&reportType='
+
reportType
,
apiConfig
.
create
());
...
...
atms-web/src/main/webapp/app/dataImport/log/import-log/import-log.ctrl.js
View file @
b75d1cec
...
...
@@ -134,10 +134,10 @@
}
}
};
getImport
IDStatus
();
getImport
Log
();
};
var
getImport
IDStatus
=
function
()
{
var
getImport
Log
=
function
()
{
vatImportService
.
displayImportLog
(
$scope
.
pagingOptions
,
constant
.
importFileType
.
undefined
).
success
(
function
(
data
)
{
if
(
data
&&
data
.
list
)
{
$scope
.
ImportLogGridSource
=
data
.
list
;
...
...
atms-web/src/main/webapp/app/dataImport/log/process-log/process-log.ctrl.js
0 → 100644
View file @
b75d1cec
citModule
.
controller
(
'processLogController'
,
[
'$scope'
,
'$log'
,
'$translate'
,
'$timeout'
,
'$q'
,
'$interval'
,
'apiInterceptor'
,
'Upload'
,
'vatImportService'
,
'SweetAlert'
,
'uiGridConstants'
,
'$uibModal'
,
'vatSessionService'
,
'enums'
,
function
(
$scope
,
$log
,
$translate
,
$timeout
,
$q
,
$interval
,
apiInterceptor
,
Upload
,
vatImportService
,
SweetAlert
,
uiGridConstants
,
$uibModal
,
vatSessionService
,
enums
)
{
'use strict'
;
$scope
.
period
=
$scope
.
periodId
;
$scope
.
moduleid
=
enums
.
vatModuleEnum
.
Import_TrialBalance
;
$scope
.
chunkSize
=
100000
;
$scope
.
projectID
=
vatSessionService
.
project
.
id
;
$scope
.
startRowNum
=
2
;
var
date
=
new
Date
();
var
year
=
date
.
getFullYear
();
var
month
=
date
.
getMonth
();
$scope
.
selectedDate
=
new
Date
(
vatSessionService
.
year
,
vatSessionService
.
month
-
1
,
1
);
$scope
.
startDate
=
new
Date
(
year
-
20
,
1
,
1
);
$scope
.
endDate
=
new
Date
(
year
+
20
,
1
,
1
);
$scope
.
viewMode
=
1
;
$scope
.
dateFormat
=
$translate
.
instant
(
'dateFormat4YearMonth'
);
//初始化ack-pagination
$scope
.
pagingOptions
=
{
pageIndex
:
1
,
//当前页码
totalItems
:
0
,
//总数据
totalPages
:
10
,
//总页数
maxSize
:
5
,
//分页数字的限制。
pageSize
:
constant
.
page
.
pageSizeArrary
[
3
],
//每页多少条数据,100条
pageSizeString
:
constant
.
page
.
pageSizeArrary
[
3
].
toString
(),
firstPage
:
$translate
.
instant
(
'PagingFirstPage'
),
previousPage
:
$translate
.
instant
(
'PagingPreviousPage'
),
nextPage
:
$translate
.
instant
(
'PagingNextPage'
),
lastPage
:
$translate
.
instant
(
'PagingLastPage'
)
};
//初始化查询参数
$scope
.
queryParams
=
{
pageInfo
:
{
pageIndex
:
1
,
//当前页码
totalItems
:
0
,
//总数据
totalPages
:
10
,
//总页数
maxSize
:
5
,
//分页数字的限制。
pageSize
:
constant
.
page
.
pageSizeArrary
[
3
],
//每页多少条数据,100条
pageSizeString
:
constant
.
page
.
pageSizeArrary
[
3
].
toString
(),
firstPage
:
$translate
.
instant
(
'PagingFirstPage'
),
previousPage
:
$translate
.
instant
(
'PagingPreviousPage'
),
nextPage
:
$translate
.
instant
(
'PagingNextPage'
),
lastPage
:
$translate
.
instant
(
'PagingLastPage'
),
}
};
var
loadProcessLogInfoDatagrid
=
function
()
{
$scope
.
processLogGridOptions
=
{
bindingOptions
:
{
dataSource
:
'ProcessLogGridSource'
},
showBorders
:
true
,
columns
:
[{
dataField
:
"id"
,
visible
:
false
,
allowHeaderFiltering
:
false
,
caption
:
$translate
.
instant
(
'id'
)
},
{
dataField
:
"taxpayerIdNum"
,
width
:
'15%'
,
allowHeaderFiltering
:
false
,
caption
:
$translate
.
instant
(
'CompanyCode'
)
},
{
dataField
:
"companyCode"
,
allowHeaderFiltering
:
false
,
caption
:
$translate
.
instant
(
'CompanyName'
),
width
:
'15%'
},
{
dataField
:
"companyName"
,
allowHeaderFiltering
:
false
,
width
:
'10%'
,
caption
:
$translate
.
instant
(
'YearPeriod'
)
},
{
dataField
:
"periodYear"
,
allowHeaderFiltering
:
false
,
width
:
'5%'
,
caption
:
$translate
.
instant
(
'Period'
)
},
{
dataField
:
"periodMonth"
,
allowHeaderFiltering
:
false
,
width
:
'15%'
,
caption
:
$translate
.
instant
(
'ValidateContent'
)
},
{
dataField
:
"periodMonth"
,
allowHeaderFiltering
:
false
,
width
:
'5%'
,
caption
:
$translate
.
instant
(
'ValidateResult'
)
},
{
dataField
:
"recordSize"
,
allowHeaderFiltering
:
false
,
width
:
'15%'
,
caption
:
$translate
.
instant
(
'ResultMsg'
)
},
{
dataField
:
"errorMsg"
,
allowHeaderFiltering
:
false
,
width
:
'10%'
,
caption
:
$translate
.
instant
(
'Operater'
)
},
{
dataField
:
"errorMsg"
,
allowHeaderFiltering
:
false
,
width
:
'15%'
,
caption
:
$translate
.
instant
(
'OperateTime'
)
}
],
onContentReady
:
function
(
e
)
{
$scope
.
accountingRateListInstance
=
e
.
component
;
var
totalCount
=
e
.
component
.
totalCount
();
if
(
totalCount
>
0
)
{
$scope
.
totalCount
=
totalCount
;
}
},
loadPanel
:
{
enabled
:
false
},
selection
:
{
mode
:
"single"
},
grouping
:
{
autoExpandAll
:
false
},
allowColumnResizing
:
true
,
columnAutoWidth
:
true
,
showRowLines
:
true
,
showColumnLines
:
true
,
rowAlternationEnabled
:
true
,
//单双行颜色
noDataText
:
$translate
.
instant
(
'NoDataText'
),
selectAllText
:
$translate
.
instant
(
'SelectAll'
),
headerFilter
:
{
visible
:
false
,
texts
:
{
cancel
:
$translate
.
instant
(
'Cancel'
),
ok
:
$translate
.
instant
(
'Confirm'
),
emptyValue
:
$translate
.
instant
(
'Empty'
),
selectAllText
:
$translate
.
instant
(
'SelectAll'
)
}
}
};
// getProcessLog();
};
var
getProcessLog
=
function
()
{
vatImportService
.
displayProcessLog
(
$scope
.
queryParams
).
success
(
function
(
data
)
{
if
(
data
&&
data
.
list
)
{
$scope
.
ProcessLogGridSource
=
data
.
list
;
$scope
.
pagingOptions
.
totalItems
=
data
.
pageInfo
.
totalCount
;
}
else
{
SweetAlert
.
error
(
$translate
.
instant
(
'SystemError'
));
}
});
};
var
initPagingControl
=
function
(
totalItemsCount
)
{
$scope
.
pagingOptions
.
totalItems
=
totalItemsCount
;
};
// 检查用户机构权限
var
checkUserOrganizationPermissionList
=
function
()
{
var
list
=
[];
var
userManageTemp
=
constant
.
vatPermission
.
dataImport
.
balanceSheet
;
list
.
push
(
userManageTemp
.
importCode
);
$scope
.
hasImportPermission
=
false
;
$scope
.
$root
.
checkUserOrganizationPermissionList
(
list
).
success
(
function
(
data
)
{
$scope
.
hasImportPermission
=
data
[
userManageTemp
.
importCode
];
});
};
//控制明细信息中删除权限
var
getUserPermission
=
function
()
{
var
list
=
[];
var
code
=
constant
.
vatPermission
.
dataImport
.
balanceSheet
.
importCode
;
list
.
push
(
code
);
$scope
.
$root
.
checkUserOrganizationPermissionList
(
list
).
success
(
function
(
data
)
{
$scope
.
hasEditPermission
=
data
[
code
];
});
};
var
setButtonWrapStyle
=
function
()
{
if
(
$scope
.
fileName
)
{
return
{
width
:
"100%"
};
}
};
var
setGridStyle
=
function
()
{
if
(
$scope
.
showTotalSecondRow
)
{
return
{
'margin-top'
:
'60px'
}
}
else
{
return
{
'margin-top'
:
'55px'
}
}
};
var
initDatePicker
=
function
()
{
var
ele1
=
$
(
"#periodDatepicker"
);
ele1
.
datepicker
({
startDate
:
$scope
.
startDate
,
endDate
:
$scope
.
endDate
,
viewMode
:
$scope
.
viewMode
,
minViewMode
:
$scope
.
viewMode
,
autoclose
:
true
,
//选中之后自动隐藏日期选择框
clearBtn
:
true
,
//清除按钮
todayBtn
:
false
,
//今日按钮
format
:
$scope
.
dateFormat
//日期格式,详见 http://bootstrap-datepicker.readthedocs.org/en/release/options.html#format
});
ele1
.
datepicker
(
"setDate"
,
$scope
.
selectedDate
);
};
var
initParam
=
function
()
{
$scope
.
initPagingControl
=
initPagingControl
;
$scope
.
setButtonWrapStyle
=
setButtonWrapStyle
;
$scope
.
setGridStyle
=
setGridStyle
;
};
//开始
(
function
initialize
()
{
$log
.
debug
(
'ImportLogController.ctor()...'
);
initParam
();
checkUserOrganizationPermissionList
();
getUserPermission
();
loadProcessLogInfoDatagrid
();
initDatePicker
();
$timeout
(
function
()
{
$scope
.
isLoadComplete
=
true
;
},
500
);
})();
}
]);
\ No newline at end of file
atms-web/src/main/webapp/app/dataImport/log/process-log/process-log.html
0 → 100644
View file @
b75d1cec
<div
class=
"process-log"
>
<!--标题-->
<div
class=
"nav-wrapper"
>
<div
class=
"nav-header"
translate=
"DataProcessLogTitle"
></div>
</div>
<div
id=
"tab_total"
>
<div
class=
"dt-init-wrapper"
>
<div
class=
"dx-viewport grid-container"
>
<div
id=
"processLogGridContainer"
dx-data-grid=
"processLogGridOptions"
style=
"margin-top: 30px;"
>
</div>
</div>
<!--<div class="page-footer">
<ack-pagination page-options="pagingOptions"
refresh-table="refreshConfigGrid()"></ack-pagination>
</div>-->
</div>
</div>
</div>
atms-web/src/main/webapp/app/dataImport/log/process-log/process-log.js
0 → 100644
View file @
b75d1cec
citModule
.
directive
(
'processLog'
,
[
'$log'
,
function
(
$log
)
{
'use strict'
;
$log
.
debug
(
'processLog.ctor()...'
);
return
{
restrict
:
'E'
,
templateUrl
:
'/app/dataImport/log/process-log/process-log.html'
+
'?_='
+
Math
.
random
(),
scope
:
{
serviceTypeId
:
"=?"
,
periodId
:
"=?"
},
controller
:
'processLogController'
,
link
:
function
(
scope
,
element
)
{
$
(
'.main-contents'
)[
0
].
style
.
width
=
"260px"
;
$
(
'.data-import-contents'
)[
0
].
style
.
display
=
"block"
;
$
(
'.main-contents'
)[
0
].
style
.
float
=
"left"
;
$
(
'.main-contents'
)[
0
].
style
.
styleFloat
=
"left"
;
$
(
'.main-contents'
)[
0
].
style
.
cssFloat
=
"left"
;
}
};
}
]);
\ No newline at end of file
atms-web/src/main/webapp/app/dataImport/log/process-log/process-log.less
0 → 100644
View file @
b75d1cec
@import "~/app-resources/less/theme.less";
.process-log {
/*background-color: @color-white;*/
padding-left: 20px;
/*min-height: 800px;*/
height: 96%;
.nav-wrapper {
/*padding-bottom: 5px;
border-bottom: 1px solid #DBD8D3;*/
.nav-header {
height: 54px;
line-height: 54px;
font-family: "Microsoft YaHei Bold", "Microsoft YaHei Regular", "Microsoft YaHei";
font-weight: 700;
font-style: normal;
font-size: 15px;
color: #333;
display: inline-block;
}
.nav-tab {
span {
display: inline-block;
height: 34px;
line-height: 34px;
padding: 0 10px;
background-color: #B90808;
color: #FFF;
font-family: "Microsoft YaHei";
font-weight: 400;
font-style: normal;
font-size: 14px;
cursor: pointer;
}
.active {
background-color: #F91000;
}
}
.alert-warning {
background-color: #FDE2DE;
cursor: pointer;
}
.alert {
color: #CF2D1B;
font-weight: bold;
display: inline-block;
padding: 5px;
margin-left: 60px;
margin-bottom: 0px;
i {
font-size: 20px;
vertical-align: middle;
margin-right: 5px;
}
}
.operation-wrapper {
margin: 15px 25px 10px 10px;
span {
cursor: pointer;
}
}
}
.dropdown-common() {
display: inline-block;
.select-button {
background-color: #F5F5F5;
padding: 6px 0;
width: 100px;
}
.caret {
margin-top: 8px;
}
.dropdown-menu {
min-width: 100px;
li {
text-align: center;
min-height: 0px;
height: 30px;
line-height: 30px;
color: #000;
font-weight: normal;
&:hover {
background-color: #F91000;
color: #FFF;
}
}
}
}
#tab_total {
display: block;
height: calc(~'100% - 40px');
position: relative;
.import-wrapper {
span {
margin-left: 10px;
color: #333;
font-family: "Microsoft YaHei";
font-style: normal;
font-size: 14px;
font-weight: bold;
}
.period-picker {
width: 150px;
border: 1px solid #c7c5c0;
display: inline-block;
line-height: 20px;
margin-top: 7px;
}
.imp-subheader {
display: inline-block;
font-size: 15px;
height: 30px;
line-height: 30px;
vertical-align: middle;
border: none;
select {
appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
background: transparent;
}
}
.dropdown {
.dropdown-common();
}
input {
width: 50px;
outline: none;
border-radius: 3px;
border: 1px solid #3c3a36;
padding: 2px;
text-align: center;
}
> button:last-child {
float: right;
margin-right: 20px;
}
.btn-wrapper {
border-radius: 5px;
background-color: #e0301e;
color: #FFF;
display: inline-block;
float: right;
margin-right: 10px;
.btn-vat-primary {
min-width: 80px;
}
}
}
.dt-init-wrapper {
max-width: 99%;
height: calc(~'100% - 25px');
position: relative;
.dropdown {
.dropdown-common();
i {
color: #F85550;
}
}
.processLogGridContainer {
height: calc(~'100% - 30px');
overflow: hidden;
position: absolute;
top: 0;
bottom: 136px; /* 130 + 6 */
left: 0;
right: 0;
background-color: #FFF;
}
}
.error-info-wrapper {
position: absolute;
height: 150px;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
background-color: #FFF;
margin-left: -40px;
}
#content-resizer {
width: 110%;
position: absolute;
height: 4px;
bottom: 150px;
left: 0;
right: 0;
background-color: red;
cursor: n-resize;
margin-left: -40px;
#topIcon {
cursor: pointer;
margin-top: -19px;
width: 38px;
margin-left: 46%;
z-index: 999;
bottom: -381px;
text-align: center;
display: block !important;
}
}
.dt-import-wrapper {
margin: 60px 0;
max-width: 99%;
overflow: auto;
height: calc(~"100% - 35px");
.dropdown {
.dropdown-common();
i {
color: #F85550;
}
}
}
}
.error-list-modal {
.modal-title {
color: #FF0000;
}
.modal-body {
max-height: 300px;
overflow-y: auto;
table {
border: 1px solid #CCC;
thead tr th {
height: 30px;
border: 1px solid #CCC;
}
tbody tr td {
height: 25px;
border: 1px solid #CCC;
}
}
}
.modal-footer {
text-align: center;
}
}
#tab_detail {
display: none;
}
/*覆写ack-pagination.less中:.page-size, .pagination 中的margin演示 */
.page-form-group{
float:right;
.page-size{
margin:0;
}
.pagination {
margin:0;
}
}
}
.tb-model-period-dropdow-popup {
width: 400px;
height: 500px;
position: fixed;
top: 25%;
left: 40%;
.modal-dialog {
width: 100%;
height: 90%;
margin: 20px auto;
.modal-content {
width: 100%;
.modal-body {
height: 90%;
}
}
}
}
#totalWrapper {
margin: 5px 10px 10px -10px;
width: 100%;
padding-left: 10px;
font-family: Microsoft YaHei;
font-size: 13px;
float:right;
.total_span{
color: #B4122A !important;
background-color:#ddd !important;
font-size: 12px !important;
font-weight:bold !important;
border-radius:10px !important;
padding-left: 8px !important;
padding-right: 8px !important;
}
.total-column{
width:15%;
float:left;
padding-left: 15px;
}
}
\ No newline at end of file
atms-web/src/main/webapp/app/vat/import/vat-import-layout/vat-import-layout.ctrl.js
View file @
b75d1cec
...
...
@@ -30,15 +30,15 @@ function ($scope, $log, $translate, $location, loginContext, enums, vatSessionSe
// },
{
name
:
'inputInvoice'
,
permission
:
constant
.
vatPermission
.
dataPreview
.
inputInvoice
.
queryCode
,
text
:
$translate
.
instant
(
'inputInvoice'
),
icon
:
'fa fa-file-text-o'
,
show
:
tru
e
text
:
$translate
.
instant
(
'inputInvoice'
),
icon
:
'fa fa-file-text-o'
,
show
:
fals
e
},
{
name
:
'outputInvoice'
,
permission
:
constant
.
vatPermission
.
dataPreview
.
outputInvoice
.
queryCode
,
text
:
$translate
.
instant
(
'outputInvoice'
),
icon
:
'fa fa-file-text-o'
,
show
:
tru
e
text
:
$translate
.
instant
(
'outputInvoice'
),
icon
:
'fa fa-file-text-o'
,
show
:
fals
e
},
{
name
:
'outputoffInvoice'
,
permission
:
constant
.
vatPermission
.
dataPreview
.
outputInvoice
.
queryCode
,
text
:
$translate
.
instant
(
'offlineBilling'
),
icon
:
'fa fa-file-text-o'
,
show
:
tru
e
text
:
$translate
.
instant
(
'offlineBilling'
),
icon
:
'fa fa-file-text-o'
,
show
:
fals
e
},
{
name
:
'trialBalance'
,
permission
:
constant
.
vatPermission
.
dataPreview
.
trialBalance
.
queryCode
,
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-cash-flow/vat-preview-cash-flow.ctrl.js
View file @
b75d1cec
vatModule
.
controller
(
'VatPreviewCashFlowController'
,
[
'$scope'
,
'$log'
,
'$translate'
,
'$timeout'
,
'SweetAlert'
,
'$q'
,
'uiGridConstants'
,
'$interval'
,
'vatPreviewService'
,
'browserService'
,
'vatSessionService'
,
'region'
,
'enums'
,
'vatExportService'
,
'$filter'
,
function
(
$scope
,
$log
,
$translate
,
$timeout
,
SweetAlert
,
$q
,
uiGridConstants
,
$interval
,
vatPreviewService
,
browserService
,
vatSessionService
,
region
,
enums
,
vatExportService
,
$filter
)
{
vatModule
.
controller
(
'VatPreviewCashFlowController'
,
[
'$
rootScope'
,
'$
scope'
,
'$log'
,
'$translate'
,
'$timeout'
,
'SweetAlert'
,
'$q'
,
'uiGridConstants'
,
'$interval'
,
'vatPreviewService'
,
'browserService'
,
'vatSessionService'
,
'region'
,
'enums'
,
'vatExportService'
,
'$filter'
,
function
(
$
rootScope
,
$
scope
,
$log
,
$translate
,
$timeout
,
SweetAlert
,
$q
,
uiGridConstants
,
$interval
,
vatPreviewService
,
browserService
,
vatSessionService
,
region
,
enums
,
vatExportService
,
$filter
)
{
'use strict'
;
$scope
.
startDate
=
new
Date
(
vatSessionService
.
project
.
year
,
0
,
1
);
...
...
@@ -252,6 +252,11 @@
$scope
.
queryParams
.
periodStart
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
$scope
.
queryParams
.
periodEnd
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
$scope
.
queryParams
.
orgId
=
vatSessionService
.
project
.
organizationID
;
if
(
$rootScope
.
currentLanguageDesc
=
$rootScope
.
currentLanguage
===
'en-us'
){
$
(
'.periodInput'
)[
0
].
style
.
left
=
"240px"
;
}
else
{
$
(
'.periodInput'
)[
0
].
style
.
left
=
"140px"
;
}
loadIncomeInvoiceItemDataFromDB
(
1
);
})();
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-cash-flow/vat-preview-cash-flow.html
View file @
b75d1cec
<div
class=
"vat-preview-cash-flow"
id=
"mainPreviewDiv"
>
<div
class=
"top-area-wrapper"
style=
"margin-top: 10px"
>
<span
translate=
"CashFlowDDTitle"
class=
"text-bold"
></span>
|
<span
class=
"text-bold"
translate=
"InvoiceQJ"
></span>
:
<input
type=
"text"
class=
"form-control input-width-middle"
style=
"position: relative; top: -30px; left: 130px;"
id=
"input-invoice-period-picker"
/>
<input
type=
"text"
class=
"form-control input-width-middle
periodInput
"
style=
"position: relative; top: -30px; left: 130px;"
id=
"input-invoice-period-picker"
/>
<span
ng-click=
"downloadCashFlow()"
style=
"position: relative; top: -13px; left: 95%;"
><i
class=
"fa fa-file-excel-o"
aria-hidden=
"true"
></i>
{{'ExportBtn' | translate}}
</span>
</div>
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-certified-invoices-list/vat-preview-certified-invoices-list.ctrl.js
View file @
b75d1cec
...
...
@@ -303,9 +303,9 @@
initCertifiedInvoicesListPagination
();
//初始化查询条件-期间范围
if
(
$rootScope
.
currentLanguageDesc
=
$rootScope
.
currentLanguage
===
'en-us'
){
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
28
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
31
0px"
;
}
else
{
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
17
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
20
0px"
;
}
$scope
.
queryParams
.
periodStart
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
$scope
.
queryParams
.
periodEnd
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-invoice-data/vat-preview-invoice-data.ctrl.js
View file @
b75d1cec
...
...
@@ -320,7 +320,7 @@
if
(
$rootScope
.
currentLanguageDesc
=
$rootScope
.
currentLanguage
===
'en-us'
){
$
(
'.periodInput'
)[
0
].
style
.
left
=
"250px"
;
}
else
{
$
(
'.periodInput'
)[
0
].
style
.
left
=
"1
5
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"1
3
0px"
;
}
loadInvoiceDataItemDataFromDB
(
1
);
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-invoice-record/vat-preview-invoice-record.ctrl.js
View file @
b75d1cec
...
...
@@ -333,7 +333,7 @@
$scope
.
queryParams
.
periodEnd
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
$scope
.
queryParams
.
orgId
=
vatSessionService
.
project
.
organizationID
;
if
(
$rootScope
.
currentLanguageDesc
=
$rootScope
.
currentLanguage
===
'en-us'
){
$
(
'.periodInput'
)[
0
].
style
.
left
=
"2
8
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"2
6
0px"
;
}
else
{
$
(
'.periodInput'
)[
0
].
style
.
left
=
"150px"
;
}
...
...
atms-web/src/main/webapp/app/vat/preview/vat-preview-red-letter-info-tab/vat-preview-red-letter-info-tab.ctrl.js
View file @
b75d1cec
...
...
@@ -317,9 +317,9 @@
initRedLetterInfoTabItemPagination
();
//初始化查询条件-期间范围
if
(
$rootScope
.
currentLanguageDesc
=
$rootScope
.
currentLanguage
===
'en-us'
){
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
28
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"
35
0px"
;
}
else
{
$
(
'.periodInput'
)[
0
].
style
.
left
=
"1
7
0px"
;
$
(
'.periodInput'
)[
0
].
style
.
left
=
"1
5
0px"
;
}
$scope
.
queryParams
.
periodStart
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
$scope
.
queryParams
.
periodEnd
=
vatSessionService
.
year
*
100
+
vatSessionService
.
month
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment