const POSTransaction=(props)=>{
const { config, carts, baskets, setBaskets, handleClose, userInfo,shift_id, member, setMember, setSaleNumber} = props
const btnTenderRef = useRef(null)
const btnPrintRef = useRef(null);
const [showModalTender,setShowModalTender] = useState(false)
const [showModalVAT,setShowModalVAT] = useState(false)
const [loading, setLoading] = useState(false)
const [paymentMethodList, setPaymentMethodList]=useState([])
const [isFormLoaded, setIsFormLoaded] = useState(false);
const {Row, Col} = ReactBootstrap
const [totalAmount, setTotalAmount] = useState(0)
const [totalAmountPaid, setTotalAmountPaid] = useState(0)
const [totalAmountRemain, setTotalAmountRemain] = useState(0)
const [tendersApplied, setTendersApplied]=useState((baskets?.basket?.tenders || []))
useEffect(() => {
if(paymentMethodList.length==0){
fetchApplyTenders()
}
}, []); // Chạy chỉ một lần khi component mount
// Focus vào nút "Hình thức thanh toán" (hoặc Hoàn tất) sau khi paymentMethodList đã được load
useEffect(() => {
if (paymentMethodList.length > 0) {
const timer = setTimeout(() => {
if (btnTenderRef.current) {
btnTenderRef.current.focus();
} else if (btnPrintRef.current) {
btnPrintRef.current.focus();
}
}, 200);
return () => clearTimeout(timer);
}
}, [paymentMethodList, baskets]);
const fetchApplyTenders = async () => {
setLoading(true);
try {
const url = '/api/get-apply-tenders';
const resultObj = await commonApi.APIGETByURL(url, config);
setLoading(false);
if (resultObj.status === 200) {
setPaymentMethodList(resultObj.data);
} else {
console.log("Unexpected response quotation:", resultObj.status);
location.href('/login?next=' + window.location.pathname + window.location.search);
}
} catch (e) {
console.log(e.message)
setLoading(false);
console.log("ERROR get-quotation", e);
}
};
const handleShowTender=()=>{
setShowModalTender(true)
btnTenderRef.current
}
const handleTransactionKeyDown = (event) => {
// Chỉ xử lý phím mũi tên khi modal chọn hình thức thanh toán và modal VAT đóng
if (showModalTender || showModalVAT) {
return;
}
const arrowKeys = ['ArrowDown', 'ArrowRight', 'ArrowUp', 'ArrowLeft'];
if (arrowKeys.includes(event.key)) {
event.preventDefault();
const buttons = document.querySelectorAll('.btn-transaction-action');
// Lọc ra các nút đang hiển thị và không bị disable
const enabledButtons = Array.from(buttons).filter(btn => {
if (btn.disabled) return false;
const style = window.getComputedStyle(btn);
return style.display !== 'none' && style.visibility !== 'hidden';
});
if (enabledButtons.length === 0) return;
const currentButtonIndex = enabledButtons.findIndex(btn => document.activeElement === btn);
let nextIndex = 0;
if (currentButtonIndex !== -1) {
if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {
nextIndex = (currentButtonIndex + 1) % enabledButtons.length;
} else {
nextIndex = (currentButtonIndex - 1 + enabledButtons.length) % enabledButtons.length;
}
} else {
nextIndex = 0; // Mặc định tập trung vào nút đầu tiên
}
enabledButtons[nextIndex].focus();
}
};
useEffect(()=>{
if (baskets==null){
return
}
const ttAmount = calculateTotalAmount(carts)
const tenders= (baskets?.basket?.tenders || [])
const ttAmountPaid = calculateTotalTenderValue(tenders)
setTotalAmount (ttAmount)
setTotalAmountPaid( ttAmountPaid)
setTotalAmountRemain(ttAmount-ttAmountPaid)
setTendersApplied(tenders)
if(btnTenderRef?.current){
btnTenderRef.current.focus()
}
if (isFormLoaded==false){
setIsFormLoaded(true);
}
if(ttAmount-ttAmountPaid <=0 && ttAmount>0){
setShowModalTender(false)
if (btnPrintRef.current) {
//btnPrintRef.current.click(); // Gọi focus khi component được render
handleCompleteTransaction()
}
}
if (btnPrintRef.current) {
btnPrintRef.current.focus(); // Gọi focus khi component được render
}
if (baskets?.transaction_id != null){
setMember(null);
if (handleClose){
handleClose()
}
}
},[carts, baskets,isFormLoaded])
const calculateTotalAmount = (carts) => {
return carts?.reduce((total, cart) => {
return total + cart.items_apply?.reduce((subTotal, item) => {
return subTotal + (item.extension );
}, 0);
}, 0);
};
const calculateTotalTenderValue = (tenders) => {
return (tenders?.reduce((total, tender) => total + parseInt( tender.value), 0) | 0);
};
const handleDeleteTender=async(tender_code)=>{
const sw = typeof Swal !== 'undefined' ? Swal : (window.Swal || null);
let alertConfirm = false;
if (sw) {
const { isConfirmed } = await sw.fire({
title: "Delete record?",
text: "Do you want to delete this record?",
icon: "question",
showCancelButton: true,
confirmButtonColor: "#7c3aed",
cancelButtonColor: "#64748b",
confirmButtonText: "Confirm",
cancelButtonText: "Cancel"
});
alertConfirm = isConfirmed;
} else {
alertConfirm = confirm("Do you want delete record");
}
if (!alertConfirm){
return;
}
setBaskets(prev => {
// Khởi tạo nếu prev là null
const basket = prev || { basket: { tenders: [] } };
// Lọc ra các tender không phải là tender_code cần xóa
const updatedTenders = basket.basket.tenders.filter(tender => tender.tender_code !== tender_code);
return {
...basket,
basket: {
...basket.basket,
tenders: updatedTenders // Cập nhật danh sách tenders
}
};
});
}
const handleCompleteTransaction= async()=>{
try {
setLoading(true);
if(shift_id==null){
alert('Chưa được mở ca')
return
}
let tenders = baskets?.basket?.tenders
let return_tx_no = baskets?.basket?.return_tx_no
if (tenders==null){
// tự tạo 1 tender C cash để cân đối bill trừ
const collected = totalAmountRemain
tenders = [
{sale_tx_no: null,
tender_code: 'C', // Giả sử trả tiền mặt TODO
collected: collected,
contribution: collected,
tender_desc: paymentMethodList?.find(obj=> obj.value=='C')?.key || ''
}
]
tenders = null
}
const transaction = {
sales_tx_hdr: {
user_id: 1, // Ví dụ ID người dùng, bạn có thể thay đổi theo yêu cầu
company_id: 1, // Ví dụ ID công ty, bạn có thể thay đổi theo yêu cầu
branch_no: 1, // Ví dụ số chi nhánh, điều chỉnh tùy theo nhu cầu
cust_code: baskets?.basket?.cust_code || null, // Lấy mã khách hàng từ basket
sale_date: new Date().toISOString(), // Ngày giao dịch hiện tại
po_number: baskets?.basket?.po_number || null, // Thay đổi nếu có thông tin
shift_id:shift_id,
carts:carts,
transaction_code:baskets?.basket?.basket_id
},
sales_tx_lines: carts?.map(cart =>
cart.items_apply.map(item => ({
sale_tx_no: null, // Sẽ được gán sau khi insert vào SalesTxHDR
item_code: item.item_code,
item_qty: item.qty,
price: item.price,
extension: item.extension,
discount_value: item.discount_value,
description:item?.product_info?.product?.description ||'',
description_vi: item.description_vi.join(', '), // Kết hợp các mô tả tiếng Việt
description_en: item.description_en.join(', '), // Kết hợp các mô tả tiếng Anh
tax_rate: parseInt( item?.product_info?.product?.Rate | 0), // Ví dụ tỷ lệ thuế, điều chỉnh theo yêu cầu
uom_vi: item.product_info.product.uom_vi,
uom_en: item.product_info.product.uom_en,
supplier_cost: parseFloat(item.product_info.product.supplier_cost),
supplier_code: item.product_info.product.supplier_code,
promo_code: cart?.id, // Thay đổi nếu có thông tin khuyến mãi
promo_name_vi: cart?.name_vi || "",
promo_name_en: cart?.name_en || "",
return_tx_no:return_tx_no
})).flat()
).flat(),
sale_tenders: tenders? tenders.map(tender => ({
sale_tx_no: null, // Sẽ được gán sau khi insert vào SalesTxHDR
tender_code: tender.tender_code,
collected: tender.value || 0,
contribution: tender.contribution || 0,
tender_desc: paymentMethodList?.find(obj=> obj.value==tender.tender_code)?.key || ''
})):null,
invoice_info: baskets?.basket?.invoice_info || null,
};
const data ={
"data":transaction
}
const updateAPI = await commonApi.APIPOSTByURL('/api/create-mdc-transaction', data, config);
const result = updateAPI;
if (result && result.status==201 && result?.data?.status=='success') {
console.log('Updated successfully:', result.data);
commonFunc.setCookies('baskets', {}, -1);
setBaskets(prev =>({
...prev,items:[], basket:{}
})
)
setSaleNumber(result?.data?.transaction_id || null)
//setBaskets(null)
//actionAlert('Updated successfully','success')
} else {
console.error('Error updating:', result.message || 'Unknown error');
//actionAlert('Update customer not successfull','error')
}
} catch (e) {
console.error("Error: " + e.message);
} finally {
setLoading(false);
}
}
const titles = {
vi: {
tenders: "Hình thức thanh toán",
totalAmount: "Tổng tiền:",
amountPaid: "Đã trả:",
amountRemaining: "Còn lại:",
excessAmount: "Tiền thừa:",
complete: "Hoàn tất",
invoice: "Xuất hóa đơn",
invoice_edit: "Sửa hóa đơn",
tenderButton: "Hình thức thanh toán"
},
en: {
tenders: "Payment Methods",
totalAmount: "Total Amount:",
amountPaid: "Amount Paid:",
amountRemaining: "Remaining:",
excessAmount: "Excess Amount:",
complete: "Complete",
invoice: "Invoice",
invoice_edit: "Edit Invoice",
tenderButton: "Payment Methods"
}
};
const user_lang = config?.lang || 'vi';
const currentTitles = titles[user_lang];
if ((paymentMethodList?.length==0 || config.branch_no==0) && userInfo?.username!='0907012207'){
if (config?.branch_no==0)
return (
Chương trình thử nghiệm !!
)
else
return <>>
}
return (
{currentTitles.tenders}
{tendersApplied?.map((tender, index) => {
const paymentMethod = paymentMethodList?.find(method => method.value === tender.tender_code);
return paymentMethod ? (
{index + 1}.
{(!['payment', 'voucher'].includes(paymentMethodList?.find(obj => obj.value == tender.tender_code)?.type)) &&
handleDeleteTender(tender?.tender_code)}
style={{ fontSize: 18, color: '#dc3545', cursor: 'pointer', transition: 'color 0.2s' }}
tabIndex={0}
/>
}
{paymentMethod.icon} {paymentMethod.key}
{commonFunc.formatNumber(tender.value)}
) : null;
})}
<>
{
(totalAmountRemain > 0) ? (
{currentTitles.tenderButton}>}
onClick={handleShowTender}
variant='warning'
type='button'
className="btn-transaction-action"
style={{ padding: '8px 16px', borderRadius: '6px', fontWeight: '600', boxShadow: '0 2px 4px rgba(255,193,7,0.2)' }}
tabIndex="0"
refCtl={btnTenderRef}
/>
) : null
}
{currentTitles.complete}>}
onClick={handleCompleteTransaction}
variant='success'
type='button'
className="btn-transaction-action"
style={{ padding: '8px 16px', borderRadius: '6px', fontWeight: '600', display: (totalAmountRemain > 0) ? 'none' : 'inline-block', boxShadow: '0 2px 4px rgba(40,167,69,0.2)' }}
tabIndex="0"
refCtl={btnPrintRef}
/>
{baskets?.basket?.invoice_info == null ? currentTitles.invoice : currentTitles.invoice_edit}>}
onClick={() => setShowModalVAT(true)}
variant='info'
type='button'
className="btn-transaction-action"
style={{ padding: '8px 16px', borderRadius: '6px', fontWeight: '600', color: '#fff', boxShadow: '0 2px 4px rgba(23,162,184,0.2)' }}
tabIndex="0"
/>
>
{currentTitles.totalAmount}
{commonFunc.formatNumber(totalAmount)}
{currentTitles.amountPaid}
{commonFunc.formatNumber(totalAmountPaid)}
{currentTitles.amountRemaining}
{commonFunc.formatNumber(totalAmountRemain > 0 ? totalAmountRemain : 0)}
{totalAmountRemain < 0 &&
{currentTitles.excessAmount}:
{commonFunc.formatNumber(totalAmountRemain * -1)}
}
setShowModalTender(false)}
paymentMethodList={paymentMethodList} tendersApplied={tendersApplied} setTendersApplied={setTendersApplied}
totalAmountRemain={totalAmountRemain} setBaskets={setBaskets} classNameCustom="modal-custom-1" userInfo={userInfo}
config={config} custCode={baskets?.basket?.cust_code} baskets={baskets}
/>
{POSVAT &&
setShowModalVAT(false)}
setBaskets={setBaskets} baskets={baskets} style={{ zIndex: 1070 }} classNameCustom="modal-custom-1" member={member}
/>
}
);
};
const POSTender=(props)=>{
const {useMemo} =React
let scriptUrls = [
];
useEffect(() => {
if(_extension=='js'){
if(window?.TenderAdapter==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/tender_type.js')
}
if(window?.TenderMedicareVoucher==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/medicare_voucher.js')
}
if(window?.TenderGeneral==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/general.js')
}
if(window?.TenderFinViet==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/finviet.js')
}
if(window?.TenderVNPAY==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/vnpay.js')
}
if(window?.TenderMomo==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/momo.js')
}
if(window?.TenderZalo==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/zalo.js')
}
if(window?.TenderShopee==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/shopee.js')
}
if(window?.TenderGifteeVoucher==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/giftee.js')
}
if(window?.TenderUrBoxVoucher==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/urbox.js')
}
if(window?.TenderGotItVoucher==null){
scriptUrls.push('/static/e_comm/components/POS/product_cart/tender_type/gotit.js')
}
loadScripts(scriptUrls)
.then(() => {
console.log("All scripts loaded successfully.");
})
.catch(err => {
console.error(err); // Xử lý lỗi nếu có
});
}
}, []); // Chạy chỉ một lần khi component mount
const { paymentMethodList,tendersApplied,setTendersApplied, totalAmountRemain,custCode,baskets, setBaskets,handleCloseModalTender, userInfo, carts, config} = props
const [loading, setLoading] = useState(false)
const {Row, Col, Button} = ReactBootstrap
const [showModalTenderLine, setShowModalTenderLine] = useState(false)
const [tenderSelected, setTenderSelected] = useState()
const [focusedTender, setFocusedTender] = useState(null)
const [isFormLoaded, setIsFormLoaded] = useState(false);
// Gọi hàm này khi form đã load
const groupedMethods = paymentMethodList?.reduce((acc, method, index) => {
// Tạo bản sao của phương thức với chỉ số
const methodWithIndex = { ...method, index }; // Thêm chỉ số vào phương thức
(acc[method.type] = acc[method.type] || []).push(methodWithIndex);
return acc;
}, {});
const hotkeyMap = useMemo(() => {
const map = {};
if (groupedMethods) {
Object.values(groupedMethods).forEach(methods => {
methods.forEach(method => {
// Đảm bảo hotkey là chữ hoa để khớp với event.key
if (method.value) {
map[method.value.toUpperCase()] = method;
}
});
});
}
return map;
}, [groupedMethods]);
// 1. Chỉ focus vào nút đầu tiên 1 lần duy nhất khi mount component (mở modal)
useEffect(() => {
const timer = setTimeout(() => {
const buttons = document.querySelectorAll('.btn-tender-select');
for (let button of buttons) {
if (!button.disabled) {
button.focus(); // Gọi focus trên button đầu tiên không bị disabled
break;
}
}
}, 150); // Để 150ms cho modal mở hoàn chỉnh
return () => clearTimeout(timer);
}, []);
// 2. Quản lý sự kiện phím nóng (hotkeys) toàn cục
useEffect(() => {
const handleGlobalKeyDown = (event) => {
if (showModalTenderLine) {
return;
}
if (hotkeyMap == null || Object.keys(hotkeyMap).length === 0) {
return;
}
const pressedKey = event.key.toUpperCase();
const method = hotkeyMap[pressedKey];
if (method) {
event.preventDefault();
if (!isMethodDisabled(method)) {
handleTenderClick(method);
}
}
};
document.addEventListener('keydown', handleGlobalKeyDown);
return () => {
document.removeEventListener('keydown', handleGlobalKeyDown);
};
}, [hotkeyMap]);
const handleTenderClick = (method) => {
setTenderSelected(method.value)
setShowModalTenderLine(true)
};
const backdrop = document.querySelector('.modal-backdrop');
if (backdrop) {
//backdrop.classList.add('modal-backdrop-1');
}
const isMethodDisabled = (method) => {
const isApplied = tendersApplied?.find(obj => obj.tender_code === method.value);
const isNineAndNoCustomer = (method.value === '9' && (baskets?.basket?.cust_code === null || baskets?.basket?.cust_code === undefined));
return isApplied || isNineAndNoCustomer;
};
const getTenderColor = (value, isFocused, isDisabled) => {
if (isDisabled) {
return {
border: '1px solid #dee2e6',
bg: '#e9ecef',
color: '#6c757d',
badgeBg: '#adb5bd'
};
}
// Bảng màu chuẩn khớp với database: C = Cash, O = Momo, K = Zalo, J = ShopeePay, P/I = VNPAY, 9 = CRM, 1 = CK/CongNo
const colors = {
'C': { // Cash - Tiền mặt -> Màu Xanh lá cây (Thanh bình, tin cậy)
border: '#198754',
bg: isFocused ? '#e8f5e9' : '#f4faf6',
color: '#198754',
badgeBg: '#198754'
},
'O': { // Momo QR -> Màu Hồng sen thương hiệu
border: '#d21f3c',
bg: isFocused ? '#fce4ec' : '#fff0f5',
color: '#d21f3c',
badgeBg: '#d21f3c'
},
'K': { // ZaloPay QR -> Màu Xanh lam
border: '#0084ff',
bg: isFocused ? '#e1f5fe' : '#f1faff',
color: '#0084ff',
badgeBg: '#0084ff'
},
'J': { // ShopeePay QR -> Màu Cam đặc trưng
border: '#ee4d2d',
bg: isFocused ? '#fbe9e7' : '#fff3e0',
color: '#ee4d2d',
badgeBg: '#ee4d2d'
},
'P': { // VNPAY QR -> Màu Xanh dương thương hiệu
border: '#005baa',
bg: isFocused ? '#e3f2fd' : '#f0f7fc',
color: '#005baa',
badgeBg: '#005baa'
},
'I': { // VNPAY CARDS -> Màu Xanh dương nhạt
border: '#007bff',
bg: isFocused ? '#e7f3ff' : '#f4f9ff',
color: '#007bff',
badgeBg: '#007bff'
},
'W': { // FinViet QR -> Màu Xám đen công nghệ
border: '#343a40',
bg: isFocused ? '#e2e3e5' : '#f8f9fa',
color: '#343a40',
badgeBg: '#343a40'
},
'9': { // CRM Voucher -> Màu Vàng Gold/Cam ấm
border: '#ffc107',
bg: isFocused ? '#fffde7' : '#fffdf0',
color: '#b78103',
badgeBg: '#ffc107'
},
'1': { // Chuyển khoản / Công nợ -> Màu Slate xám thanh lịch
border: '#6c757d',
bg: isFocused ? '#f1f2f3' : '#fafbfc',
color: '#495057',
badgeBg: '#6c757d'
}
};
const upperVal = value ? value.toUpperCase() : '';
// So khớp trực tiếp hoặc tương đối
let match = Object.keys(colors).find(key => upperVal === key);
if (!match) {
// Nếu không khớp trực tiếp, check xem có chứa ký tự không (ví dụ cho Voucher hoặc Platform)
if (['6', '7', 'R', 'S'].includes(upperVal)) {
// Nhóm các loại Voucher khác -> Màu Hồng phấn nhạt ngọt ngào
return {
border: isFocused ? '2px solid #e685b5' : '1px solid #e685b5',
bg: isFocused ? '#fff0f6' : '#fff9fb',
color: '#e685b5',
badgeBg: '#e685b5'
};
}
if (['3', '4', '5', 'L', 'T', 'H', 'E'].includes(upperVal)) {
// Nhóm các sàn TMĐT / Đối tác giao hàng -> Màu Teal hiện đại
return {
border: isFocused ? '2px solid #0ea5e9' : '1px solid #0ea5e9',
bg: isFocused ? '#f0f9ff' : '#fafefe',
color: '#0ea5e9',
badgeBg: '#0ea5e9'
};
}
}
if (match) {
const scheme = colors[match];
return {
border: isFocused ? `2px solid ${scheme.border}` : `1px solid ${scheme.border}`,
bg: scheme.bg,
color: scheme.color,
badgeBg: scheme.badgeBg
};
}
// Mặc định tông màu Cyan thanh lịch
return {
border: isFocused ? '2px solid #0dcaf0' : '1px solid #0dcaf0',
bg: isFocused ? '#e0f7fa' : '#fff',
color: '#0dcaf0',
badgeBg: '#0dcaf0'
};
};
const handleContainerKeyDown = (event) => {
if (showModalTenderLine) {
return;
}
// Di chuyển bằng phím mũi tên trực tiếp tại container để tránh bị Modal cướp sự kiện
const arrowKeys = ['ArrowDown', 'ArrowRight', 'ArrowUp', 'ArrowLeft'];
if (arrowKeys.includes(event.key)) {
event.preventDefault();
const buttons = document.querySelectorAll('.btn-tender-select');
const enabledButtons = Array.from(buttons).filter(btn => !btn.disabled);
if (enabledButtons.length === 0) return;
const currentButtonIndex = enabledButtons.findIndex(btn => document.activeElement === btn);
let nextIndex = 0;
if (currentButtonIndex !== -1) {
if (event.key === 'ArrowDown' || event.key === 'ArrowRight') {
nextIndex = (currentButtonIndex + 1) % enabledButtons.length;
} else {
nextIndex = (currentButtonIndex - 1 + enabledButtons.length) % enabledButtons.length;
}
} else {
nextIndex = 0;
}
enabledButtons[nextIndex].focus();
}
};
return (
{Object.keys(groupedMethods)?.map((type) => (
{type.charAt(0).toUpperCase() + type.slice(1)}
{groupedMethods[type]?.map((method, index) => {
const isDisabled = isMethodDisabled(method);
const isFocused = focusedTender === method.value;
const colors = getTenderColor(method.value, isFocused, isDisabled);
return (
);
})}
))}
obj.value==tenderSelected)?.key }
childComponent={POSTenderLine} show = {showModalTenderLine}
backdrop={"static"} fullscreen={true}
setShowForm={setShowModalTenderLine} setShow={setShowModalTenderLine} handleCloseModalTenderLine={()=>setShowModalTenderLine(false)}
setTendersApplied={setTendersApplied} tenderSelected={tenderSelected} baskets={baskets} handleCloseModalTender={handleCloseModalTender}
totalAmountRemain = {totalAmountRemain} setBaskets={setBaskets} userInfo = {userInfo}
carts = {carts} config = {config} custCode = {custCode} paymentType={paymentMethodList?.find(obj=>obj.value==tenderSelected)}
classNameCustom="modal-custom-2"
/>
);
};
const POSTenderLine=(props)=>{
const {tenderSelected, totalAmountRemain, handleCloseModalTenderLine, handleCloseModalTender,baskets, setBaskets, custCode, carts,userInfo, config,paymentType
} = props
const amountTenderPayRef = useRef(null);
const [amountTenderPay, setAmountTenderPay] = useState(0)
const { Row, Col } =ReactBootstrap
useEffect(() => {
// Đặt amountTenderPay thành totalAmountRemain khi component được mount
if (paymentType?.type=='voucher' || paymentType?.type=='payment' ){
setAmountTenderPay(0);
}else{
setAmountTenderPay(totalAmountRemain);
}
}, [totalAmountRemain]);
useEffect(() => {
if (amountTenderPayRef?.current){
amountTenderPayRef.current.focus();
amountTenderPayRef.current.select();
}
}, []);
const backdrop = document.querySelector('.modal-backdrop');
if (backdrop) {
//backdrop.classList.add('modal-backdrop-2');
}
const handlePayment = () => {
setBaskets(prev => {
let basket = prev || { basket: { tenders: [] } }; // Khởi tạo nếu prev là null
const existingTenderIndex = (basket?.basket?.tenders || [])?.findIndex(tender => tender.tender_code === tenderSelected);
if (existingTenderIndex !== -1) {
// Nếu tender đã tồn tại, cập nhật giá trị
const updatedTenders = [...basket.basket.tenders];
updatedTenders[existingTenderIndex].value = amountTenderPay; // Cập nhật giá trị collected
updatedTenders[existingTenderIndex].contribution = (tenderSelected!='C' ? amountTenderPay : (amountTenderPay>totalAmountRemain? totalAmountRemain:amountTenderPay)) ||0;
return {
...basket,
basket: {
...basket.basket,
tenders: updatedTenders
}
};
} else {
// Nếu tender chưa tồn tại, thêm mới vào danh sách
return {
...basket,
basket: {
...basket.basket,
tenders: [
...basket.basket.tenders || [],
{
tender_code: tenderSelected,
value: amountTenderPay,
contribution:( tenderSelected!='C' ? amountTenderPay : (amountTenderPay>totalAmountRemain? totalAmountRemain:amountTenderPay) ) || 0,
basket_id: basket?.basket.basket_id
}
]
}
};
}
});
// Đóng modal hoặc thực hiện hành động khác
handleCloseModalTenderLine();
if (totalAmountRemain <= amountTenderPay && handleCloseModalTender){
handleCloseModalTender()
}
};
const handleAmountTenderPayChange = (e) => {
const newValue = commonFunc.unFormatCurrency(e.target.value);
console.log(newValue); // Xem giá trị mới
setAmountTenderPay(newValue);
};
const texts = {
paymentRemaining: {
vi: "Còn lại:",
en: "Remaining:"
},
paymentAmount: {
vi: "Số tiền thanh toán:",
en: "Payment Amount:"
},
close: {
vi: "Đóng",
en: "Close"
},
pay: {
vi: "Thanh toán",
en: "Pay"
}
};
return (
handleAmountTenderPayChange(e)}
type='text'
required={false}
feedback={null}
onEnter={handlePayment}
size="sm"
autoFocus={true}
onFocus={null}
style={{ textAlign: 'right' }}
min={0}
styleInput={{ textAlign: 'right', fontWeight: '700', color: '#dc3545', border: '1px solid #ced4da', borderRadius: '4px' }}
disabled={((paymentType?.type === 'voucher' || paymentType?.type === 'payment') ? true : false)}
tabIndex="1"
inputRef={amountTenderPayRef}
/>
);
};