Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
shopping-mall
Commits
620ebde0
Commit
620ebde0
authored
Feb 03, 2021
by
Jiwon Yoon
Browse files
무통장입금 수정
parent
2ff3fb7c
Changes
12
Show whitespace changes
Inline
Side-by-side
client/src/Components/ListCard.js
View file @
620ebde0
...
@@ -55,7 +55,7 @@ function ListCard(props) {
...
@@ -55,7 +55,7 @@ function ListCard(props) {
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
createdAt
.
substring
(
0
,
10
)}
<
/strong></
Col
>
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
createdAt
.
substring
(
0
,
10
)}
<
/strong></
Col
>
<
Col
sm
=
{
3
}
xs
=
{
5
}
className
=
'
p-1
'
><
li
>
결제정보
:
<
/li></
Col
>
<
Col
sm
=
{
3
}
xs
=
{
5
}
className
=
'
p-1
'
><
li
>
결제정보
:
<
/li></
Col
>
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
paymentWay
}
<
/strong>{e.paymentWay
== 'Remittance'
?
(
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
completeState
}
<
/strong>{e.completeState
== 'Remittance'
?
(
<>
<>
<
br
/><
strong
>
{
e
.
paymentInfo
.
bank
}
/ ~ {e.paymentInfo.deadline}</
strong
>
<
br
/><
strong
>
{
e
.
paymentInfo
.
bank
}
/ ~ {e.paymentInfo.deadline}</
strong
>
<
/
>
<
/
>
...
...
client/src/Pages/Payment.js
View file @
620ebde0
...
@@ -6,6 +6,7 @@ import axios from 'axios';
...
@@ -6,6 +6,7 @@ import axios from 'axios';
import
{
isAuthenticated
}
from
'
../utils/auth
'
;
import
{
isAuthenticated
}
from
'
../utils/auth
'
;
import
catchErrors
from
'
../utils/catchErrors
'
;
import
catchErrors
from
'
../utils/catchErrors
'
;
import
{
Container
,
Row
,
Col
,
Button
,
Form
}
from
'
react-bootstrap
'
;
import
{
Container
,
Row
,
Col
,
Button
,
Form
}
from
'
react-bootstrap
'
;
const
paymentInfo
=
{}
function
Payment
({
match
,
location
})
{
function
Payment
({
match
,
location
})
{
const
[
cart
,
setCart
]
=
useState
([])
const
[
cart
,
setCart
]
=
useState
([])
...
@@ -20,7 +21,6 @@ function Payment({ match, location }) {
...
@@ -20,7 +21,6 @@ function Payment({ match, location }) {
const
[
completeState
,
setCompleteState
]
=
useState
(
false
)
const
[
completeState
,
setCompleteState
]
=
useState
(
false
)
const
user
=
isAuthenticated
()
const
user
=
isAuthenticated
()
let
history
=
useHistory
();
let
history
=
useHistory
();
const
preCart
=
[]
useEffect
(()
=>
{
useEffect
(()
=>
{
getUser
()
getUser
()
...
@@ -79,10 +79,18 @@ function Payment({ match, location }) {
...
@@ -79,10 +79,18 @@ function Payment({ match, location }) {
function
handleReceiverInfo
(
e
)
{
function
handleReceiverInfo
(
e
)
{
const
{
name
,
value
}
=
e
.
target
const
{
name
,
value
}
=
e
.
target
console
.
log
(
name
,
value
)
console
.
log
(
name
,
value
)
setOrder
({
...
order
,
receiverInfo
:
{
...
order
.
receiverInfo
,
[
name
]:
value
}
})
setOrder
({
...
order
,
receiverInfo
:
{
...
order
.
receiverInfo
,
[
name
]:
value
}
})
}
}
function
handlepaymentInfo
(
e
)
{
const
{
name
,
value
}
=
e
.
target
// console.log(name, value)
paymentInfo
[
name
]
=
value
console
.
log
(
paymentInfo
)
// setOrder({ ...order, paymentInfo: { ...order.paymentInfo, [name]: value } })
}
function
postClick
()
{
function
postClick
()
{
if
(
post
.
length
!==
0
)
{
if
(
post
.
length
!==
0
)
{
setPost
([])
setPost
([])
...
@@ -122,37 +130,33 @@ function Payment({ match, location }) {
...
@@ -122,37 +130,33 @@ function Payment({ match, location }) {
};
};
function
handleClick
()
{
function
handleClick
()
{
if
(
paymentWay
.
length
!==
0
)
{
setCompleteState
(
false
)
setPaymentWay
([])
}
else
{
const
bankList
=
(
const
bankList
=
(
<
Row
className
=
"
justify-content-md-center
"
>
<
Row
className
=
"
justify-content-md-center
"
>
<
Col
md
=
{
6
}
className
=
"
border m-5 p-5
"
>
<
Col
md
=
{
6
}
className
=
"
border m-5 p-5
"
>
<
Form
>
<
Form
>
<
Form
.
Group
controlId
=
"
bank
"
>
<
Form
.
Group
controlId
=
"
bank
"
>
<
Form
.
Label
>
입금은행
<
/Form.Label
>
<
Form
.
Label
>
입금은행
<
/Form.Label
>
<
Form
.
Control
as
=
"
select
"
name
=
"
bank
"
onChange
=
{
handle
Receiver
Info
}
>
<
Form
.
Control
as
=
"
select
"
name
=
"
bank
"
onChange
=
{
handle
payment
Info
}
>
<
option
value
=
''
>
입금은행을
선택하세요
.
<
/option
>
<
option
value
=
''
>
입금은행을
선택하세요
.
<
/option
>
<
option
value
=
"
농협
"
>
농협
/
352
-
0559
-
2528
-
83
/
김수빈
<
/option
>
<
option
value
=
"
농협
/ 352-0559-2528-83 / 김수빈
"
>
농협
/
352
-
0559
-
2528
-
83
/
김수빈
<
/option
>
<
option
value
=
"
우리은행
"
>
우리은행
/
0000
-
000
-
000000
/
이재연
<
/option
>
<
option
value
=
"
우리은행
/ 0000-000-000000 / 이재연
"
>
우리은행
/
0000
-
000
-
000000
/
이재연
<
/option
>
<
option
value
=
"
국민은행
"
>
국민은행
/
111111
-
11
-
111111
/
윤대기
<
/option
>
<
option
value
=
"
국민은행
/ 111111-11-111111 / 윤대기
"
>
국민은행
/
111111
-
11
-
111111
/
윤대기
<
/option
>
<
/Form.Control
>
<
/Form.Control
>
<
/Form.Group
>
<
/Form.Group
>
<
Form
.
Group
controlId
=
"
depositor
"
>
<
Form
.
Group
controlId
=
"
depositor
"
>
<
Form
.
Label
>
입금자
<
/Form.Label
>
<
Form
.
Label
>
입금자
<
/Form.Label
>
<
Form
.
Control
type
=
"
text
"
name
=
"
depositor
"
onChange
=
{
handle
Receiver
Info
}
/
>
<
Form
.
Control
type
=
"
text
"
name
=
"
depositor
"
onChange
=
{
handle
payment
Info
}
/
>
<
/Form.Group
>
<
/Form.Group
>
<
Form
.
Group
controlId
=
"
deadline
"
>
<
Form
.
Group
controlId
=
"
deadline
"
>
<
Form
.
Label
>
입금예정일
<
/Form.Label
>
<
Form
.
Label
>
입금예정일
<
/Form.Label
>
<
Form
.
Control
type
=
"
date
"
name
=
"
deadline
"
onChange
=
{
handle
Receiver
Info
}
/
>
<
Form
.
Control
type
=
"
date
"
name
=
"
deadline
"
onChange
=
{
handle
payment
Info
}
/
>
<
/Form.Group
>
<
/Form.Group
>
<
/Form
>
<
/Form
>
<
/Col
>
<
/Col
>
<
/Row>
)
<
/Row>
)
setCompleteState
(
"
Remittance
"
)
setCompleteState
(
"
Remittance
"
)
setPaymentWay
(
bankList
)
setPaymentWay
(
bankList
)
}
}
}
async
function
kakaopay
()
{
async
function
kakaopay
()
{
...
@@ -163,66 +167,91 @@ function Payment({ match, location }) {
...
@@ -163,66 +167,91 @@ function Payment({ match, location }) {
<
p
>
주문하기를
눌러
결제를
이어가주세요
.
<
/p
>
<
p
>
주문하기를
눌러
결제를
이어가주세요
.
<
/p
>
<
/div
>
<
/div
>
)
)
// setOrder({ ...order, paymentInfo: { bank: "kakaopay" }})
}
}
async
function
paymentCompleted
()
{
async
function
paymentCompleted
()
{
console
.
log
(
paymentInfo
)
console
.
log
(
completeState
)
const
cartIds
=
[]
const
cartIds
=
[]
order
.
products
.
map
((
el
)
=>
{
order
.
products
.
map
((
el
)
=>
{
cartIds
.
push
(
el
.
_id
)
cartIds
.
push
(
el
.
_id
)
})
})
// try {
try
{
// setError('')
setError
(
''
)
// const response = await axios.post(`/api/order/addorder`, {
if
(
completeState
===
"
kakaopay
"
)
{
// userId: user,
let
itemNames
=
""
// ...order,
if
(
cart
.
length
>
1
)
{
// paymentWay: completeState,
itemNames
=
cart
[
0
].
productId
.
pro_name
+
'
외
'
+
String
(
cart
.
length
-
1
)
+
'
개
'
// total: finalPrice + 2500
}
else
{
// })
itemNames
=
cart
[
0
].
productId
.
pro_name
// const response2 = await axios.post(`/api/cart/deletecart2`, {
}
// userId: user,
setError
(
''
)
// cartId: cartIds
const
response
=
await
fetch
(
'
/api/kakaopay/test/single
'
,
{
// })
method
:
"
POST
"
,
// const response3 = await axios.post(`/api/product/pluspurchase`, {
headers
:
{
// products: order.products
'
Content-type
'
:
'
application/json
'
// })
},
// if (completeState === "kakaopay") {
body
:
JSON
.
stringify
({
// let itemNames = ""
cid
:
'
TC0ONETIME
'
,
// if (cart.length > 1) {
partner_order_id
:
'
partner_order_id
'
,
// itemNames = cart[0].productId.pro_name + ' 외 ' + String(cart.length - 1) + '개'
partner_user_id
:
user
,
// } else {
item_name
:
itemNames
,
// itemNames = cart[0].productId.pro_name
quantity
:
cart
.
length
,
// }
total_amount
:
finalPrice
+
2500
,
// setError('')
vat_amount
:
200
,
// const response = await fetch('/api/kakaopay/test/single', {
tax_free_amount
:
0
,
// method: "POST",
approval_url
:
'
http://localhost:3000/paymentcompleted
'
,
// headers: {
fail_url
:
'
http://localhost:3000/shoppingcart
'
,
// 'Content-type': 'application/json'
cancel_url
:
'
http://localhost:3000/shoppingcart
'
,
// },
})
// body: JSON.stringify({
})
// cid: 'TC0ONETIME',
const
data
=
await
response
.
json
()
// partner_order_id: 'partner_order_id',
const
response1
=
await
axios
.
post
(
`/api/order/addorder`
,
{
// partner_user_id: user,
userId
:
user
,
// item_name: itemNames,
...
order
,
// quantity: cart.length,
completeState
,
// total_amount: finalPrice + 2500,
total
:
finalPrice
+
2500
// vat_amount: 200,
})
// tax_free_amount: 0,
const
response2
=
await
axios
.
post
(
`/api/cart/deletecart2`
,
{
// approval_url: 'http://localhost:3000/paymentcompleted',
userId
:
user
,
// fail_url: 'http://localhost:3000/shoppingcart',
cartId
:
cartIds
// cancel_url: 'http://localhost:3000/shoppingcart',
})
// })
const
response3
=
await
axios
.
post
(
`/api/product/pluspurchase`
,
{
// })
products
:
order
.
products
// const data = await response.json()
})
// window.location.href = data.redirect_url
if
(
response1
&&
response2
&&
response3
)
{
// } else {
window
.
location
.
href
=
data
.
redirect_url
// alert("주문이 완료되었습니다.")
}
// history.push('/paymentcompleted')
}
else
if
(
completeState
===
"
Remittance
"
){
// }
const
response1
=
await
axios
.
post
(
`/api/order/addorder`
,
{
// } catch (error) {
userId
:
user
,
// catchErrors(error, setError)
...
order
,
// alert("주문에 실패하셨습니다. 다시 확인해주세요.")
paymentInfo
,
// window.location.reload()
completeState
,
// }
total
:
finalPrice
+
2500
})
const
response2
=
await
axios
.
post
(
`/api/cart/deletecart2`
,
{
userId
:
user
,
cartId
:
cartIds
})
const
response3
=
await
axios
.
post
(
`/api/product/pluspurchase`
,
{
products
:
order
.
products
})
if
(
response1
&&
response2
&&
response3
)
{
alert
(
"
주문이 완료되었습니다.
"
)
history
.
push
(
'
/paymentcompleted
'
)
}
else
{
alert
(
"
주문에 실패하셨습니다. 다시 확인해주세요.
"
)
}
}
else
{
alert
(
"
completeState없음
"
)
}
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
alert
(
"
주문에 실패하셨습니다. 정보가 모두 입력되었는지 다시 확인해주세요.
"
)
window
.
location
.
reload
()
}
}
}
if
(
error
)
{
if
(
error
)
{
...
@@ -232,7 +261,7 @@ function Payment({ match, location }) {
...
@@ -232,7 +261,7 @@ function Payment({ match, location }) {
return
(
return
(
<
Container
className
=
"
mb-5
"
>
<
Container
className
=
"
mb-5
"
>
{
console
.
log
(
"
order=
"
,
order
)}
{
console
.
log
(
"
order=
"
,
order
)}
<
h3
className
=
"
my-5 font-weight-bold text-center
"
>
주문
/
결제
<
/h3
>
<
h3
className
=
"
my-5 font-weight-bold text-center
"
>
주문
/
결제
<
/h3
>
<
div
>
<
div
>
<
h5
className
=
"
font-weight-bold py-3 border-top border-bottom text-center
"
style
=
{{
background
:
'
#F7F3F3
'
}}
>
주문자
정보
<
/h5
>
<
h5
className
=
"
font-weight-bold py-3 border-top border-bottom text-center
"
style
=
{{
background
:
'
#F7F3F3
'
}}
>
주문자
정보
<
/h5
>
...
@@ -313,9 +342,32 @@ function Payment({ match, location }) {
...
@@ -313,9 +342,32 @@ function Payment({ match, location }) {
<
div
>
<
div
>
<
h5
className
=
"
font-weight-bold py-3 border-top border-bottom text-center
"
style
=
{{
background
:
'
#F7F3F3
'
}}
>
결제수단
<
/h5
>
<
h5
className
=
"
font-weight-bold py-3 border-top border-bottom text-center
"
style
=
{{
background
:
'
#F7F3F3
'
}}
>
결제수단
<
/h5
>
<
div
className
=
"
text-center m-3
"
>
<
div
className
=
"
text-center m-3
"
>
<
Button
className
=
"
align-top m-1
"
variant
=
"
success
"
onClick
=
{
handleClick
}
style
=
{{
height
:
'
42px
'
}}
>
무통장입금
<
/Button
>
<
Button
className
=
"
align-top m-1
"
variant
=
"
success
"
type
=
"
button
"
onClick
=
{
handleClick
}
style
=
{{
height
:
'
42px
'
}}
>
무통장입금
<
/Button
>
<
Button
className
=
"
align-top m-1 p-0
"
style
=
{{
borderColor
:
"
#ffeb00
"
}}
type
=
"
button
"
onClick
=
{
kakaopay
}
alt
=
"
카카오페이
"
><
img
src
=
"
icon/payment_icon_yellow_small2.png
"
/><
/Button
>
<
Button
className
=
"
align-top m-1 p-0
"
style
=
{{
borderColor
:
"
#ffeb00
"
}}
type
=
"
button
"
onClick
=
{
kakaopay
}
alt
=
"
카카오페이
"
><
img
src
=
"
icon/payment_icon_yellow_small2.png
"
/><
/Button
>
<
/div
>
<
/div
>
{
/* <Row className="justify-content-md-center">
<Col md={6} className="border m-5 p-5">
<Form>
<Form.Group controlId="bank">
<Form.Label>입금은행</Form.Label>
<Form.Control as="select" name="bank" onChange={handlepaymentInfo}>
<option value=''>입금은행을 선택하세요.</option>
<option value="농협 / 352-0559-2528-83 / 김수빈">농협 / 352-0559-2528-83 / 김수빈</option>
<option value="우리은행 / 0000-000-000000 / 이재연">우리은행 / 0000-000-000000 / 이재연</option>
<option value="국민은행 / 111111-11-111111 / 윤대기">국민은행 / 111111-11-111111 / 윤대기</option>
</Form.Control>
</Form.Group>
<Form.Group controlId="depositor">
<Form.Label>입금자</Form.Label>
<Form.Control type="text" name="depositor" onChange={handlepaymentInfo} />
</Form.Group>
<Form.Group controlId="deadline">
<Form.Label>입금예정일</Form.Label>
<Form.Control type="date" name="deadline" onChange={handlepaymentInfo} />
</Form.Group>
</Form>
</Col>
</Row> */
}
{
paymentWay
}
{
paymentWay
}
<
/div
>
<
/div
>
<
div
className
=
"
text-center
"
>
<
div
className
=
"
text-center
"
>
...
...
data/ppt/VSCode/pagination-client-component.jpg
0 → 100644
View file @
620ebde0
305 KB
data/ppt/VSCode/pagination-client.jpg
0 → 100644
View file @
620ebde0
122 KB
data/ppt/VSCode/pagination-client2.jpg
0 → 100644
View file @
620ebde0
43.2 KB
data/ppt/VSCode/pagination-server-route.jpg
0 → 100644
View file @
620ebde0
23 KB
data/ppt/VSCode/pagination-server-route2.jpg
0 → 100644
View file @
620ebde0
17 KB
data/ppt/VSCode/pagination-server1.jpg
0 → 100644
View file @
620ebde0
101 KB
data/ppt/VSCode/pagination-server2.jpg
0 → 100644
View file @
620ebde0
33.4 KB
data/ppt/mobile/user-pagination.jpg
0 → 100644
View file @
620ebde0
39.3 KB
server/controllers/order.controller.js
View file @
620ebde0
...
@@ -4,27 +4,38 @@ import User from "../schemas/User.js";
...
@@ -4,27 +4,38 @@ import User from "../schemas/User.js";
import
Product
from
"
../schemas/Product.js
"
;
import
Product
from
"
../schemas/Product.js
"
;
const
addorder
=
async
(
req
,
res
)
=>
{
const
addorder
=
async
(
req
,
res
)
=>
{
const
{
userId
,
products
,
receiverInfo
,
paymentWay
,
total
}
=
req
.
body
const
{
userId
,
products
,
receiverInfo
,
completeState
,
paymentInfo
,
total
}
=
req
.
body
console
.
log
(
"
pay=
"
,
paymentWay
)
console
.
log
(
"
paymentInfo=
"
,
paymentInfo
)
console
.
log
(
receiverInfo
.
bank
,
receiverInfo
.
depositor
,
receiverInfo
.
deadline
)
console
.
log
(
"
receiverInfo=
"
,
receiverInfo
)
// console.log(receiverInfo.bank, receiverInfo.depositor, receiverInfo.deadline)
try
{
try
{
// if (!/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/.test(receiverInfo.tel)) {
// return res.status(422).send('유효한 휴대전화번호가 아닙니다. 정확히 입력해주세요.')
// } else if (paymentWay) {
// if (paymentWay == 'Remittance') {
// if (!(receiverInfo.bank && receiverInfo.depositor && receiverInfo.deadline)) {
// return res.status(422).send('선택하신 결제 수단에 관한 모든 정보를 입력해주시기 바랍니다.')
// }
// const paymentInfo = { bank: receiverInfo.bank, depositor: receiverInfo.depositor, deadline: receiverInfo.deadline }
// const newOrder = await new Order({ userId, products, receiverInfo, paymentWay, paymentInfo, total }).save()
// res.status(200).send('Order DB에 저장 완료')
// } else {
// const newOrder = await new Order({ userId, products, receiverInfo, paymentWay, total }).save()
// res.status(200).send('Order DB에 저장 완료')
// }
// } else {
// return res.status(422).send('결제수단을 선택해주시기 바랍니다.')
// }
if
(
!
/^
[
0-9
]{2,3}
-
[
0-9
]{3,4}
-
[
0-9
]{4}
/
.
test
(
receiverInfo
.
tel
))
{
if
(
!
/^
[
0-9
]{2,3}
-
[
0-9
]{3,4}
-
[
0-9
]{4}
/
.
test
(
receiverInfo
.
tel
))
{
return
res
.
status
(
422
).
send
(
'
유효한 휴대전화번호가 아닙니다. 정확히 입력해주세요.
'
)
return
res
.
status
(
422
).
send
(
'
유효한 휴대전화번호가 아닙니다. 정확히 입력해주세요.
'
)
}
else
if
(
paymentWay
)
{
}
else
if
(
completeState
===
"
kakaopay
"
)
{
if
(
paymentWay
==
'
Remittance
'
)
{
const
paymentInfo
=
{
bank
:
"
kakaopay
"
,
depositor
:
"
none
"
,
deadline
:
"
none
"
}
if
(
!
(
receiverInfo
.
bank
&&
receiverInfo
.
depositor
&&
receiverInfo
.
deadline
))
{
const
newOrder
=
await
new
Order
({
userId
,
products
,
completeState
,
receiverInfo
,
paymentInfo
,
total
}).
save
()
return
res
.
status
(
422
).
send
(
'
선택하신 결제 수단에 관한 모든 정보를 입력해주시기 바랍니다.
'
)
}
const
paymentInfo
=
{
bank
:
receiverInfo
.
bank
,
depositor
:
receiverInfo
.
depositor
,
deadline
:
receiverInfo
.
deadline
}
const
newOrder
=
await
new
Order
({
userId
,
products
,
receiverInfo
,
paymentWay
,
paymentInfo
,
total
}).
save
()
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
}
else
{
}
else
{
const
newOrder
=
await
new
Order
({
userId
,
products
,
receiverInfo
,
payment
Way
,
total
}).
save
()
const
newOrder
=
await
new
Order
({
userId
,
products
,
completeState
,
receiverInfo
,
payment
Info
,
total
}).
save
()
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
}
}
}
else
{
return
res
.
status
(
422
).
send
(
'
결제수단을 선택해주시기 바랍니다.
'
)
}
}
catch
(
error
)
{
}
catch
(
error
)
{
console
.
log
(
error
)
console
.
log
(
error
)
res
.
status
(
500
).
send
(
'
Order DB에 저장 실패
'
)
res
.
status
(
500
).
send
(
'
Order DB에 저장 실패
'
)
...
...
server/schemas/Order.js
View file @
620ebde0
...
@@ -53,19 +53,22 @@ const OrderSchema = new mongoose.Schema({
...
@@ -53,19 +53,22 @@ const OrderSchema = new mongoose.Schema({
required
:
true
required
:
true
}
}
},
},
paymentWay
:
{
completeState
:
{
type
:
String
,
type
:
String
,
required
:
true
required
:
true
},
},
paymentInfo
:
{
paymentInfo
:
{
bank
:
{
bank
:
{
type
:
String
type
:
String
,
required
:
true
},
},
depositor
:
{
depositor
:
{
type
:
String
type
:
String
,
required
:
true
},
},
deadline
:
{
deadline
:
{
type
:
String
type
:
String
,
required
:
true
}
}
},
},
total
:
{
total
:
{
...
...
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