Merge pull request 'edit-quantity-weight' (#97) from edit-quantity-weight into main

Reviewed-on: Pozomind/pozo-retail-app#97
This commit is contained in:
karthikalakshmi 2026-02-06 17:42:43 +05:30
commit 776b3d8a29
10 changed files with 223 additions and 305 deletions

View File

@ -40,6 +40,7 @@ import {
} from '../../../../../Features/Offer/Offernew/BookingOffernew.js';
import { validateOffers } from '../../BSItemCards/ValidateOffer.jsx';
import { v4 as uuidv4 } from 'uuid';
import WeightCalculatePrice from './WeightCalculatePrice.jsx';
const BSBillingEditQuantity = (props) => {
const dispatch = useDispatch();
@ -678,12 +679,12 @@ const BSBillingEditQuantity = (props) => {
const handleEditQuantity = async (
editedProduct,
editedProductIndex,
newPrice
newPrice,
overrideQty = null
) => {
// check itself is a offer product
const editedQty =
props?.Productdata?.ScaleType !== 'weight'
const editedQty = overrideQty !== null
? overrideQty
: props?.Productdata?.ScaleType !== 'weight'
? parseInt(Quantity)
: props.Productdata.OrderQty;
const addFirst = BillOrderPre === 'Y';
@ -3096,9 +3097,10 @@ const BSBillingEditQuantity = (props) => {
newPrice = 0,
offerApply = false
) => {
const fixedQty = Number(qty.toFixed(3));
const updatedProduct = {
...editedProduct,
OrderQty: qty,
OrderQty: fixedQty,
OrderRate: newPrice > 0 ? newPrice : editedProduct?.OrderRate,
...calculateTaxAmounts({
qty: qty,
@ -3236,289 +3238,6 @@ const BSBillingEditQuantity = (props) => {
OfferValue: offerValue,
};
};
// const AddProductQuantity = async () => {
// let NewPrice = NewPrice1 > 0 ? NewPrice1 : props.Productdata.OrderRate;
// await dispatch(changeHoldOrderDtl(false));
// await dispatch(changePreviousOrderLength(CartOrderDetails?.length));
// const OtherOrderDatas = CartOrderDetails?.filter(
// (cartItem) =>
// !(
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem.InwardDtlId === props?.Productdata?.InwardDtlId &&
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName
// ) && !cartItem?.SalesId
// );
// const OtherOrderDatawithsales = CartOrderDetails?.filter(
// (cartItem) => cartItem?.SalesId
// );
// const OtherorderDataforNormal = CartOrderDetails?.filter(
// (cartItem) =>
// !(
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName &&
// !cartItem?.SalesId
// )
// );
// const isItemInCart = CartOrderDetails?.find(
// (cartItem) =>
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName &&
// !cartItem?.SalesId
// ); // check if the item is already in the cart
// // changing for one piece stock checking
// const isItemInCartfilter = CartOrderDetails?.filter(
// (cartItem) =>
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// !(
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName
// ) &&
// !cartItem?.SalesId
// ); // check if the item is already in the cart
// let OverallQuantity = CalculateOverallQty(isItemInCart, isItemInCartfilter);
// const BookingTypeProd = props?.Productdata?.BookingTypeName;
// const isItemInCartHold = CartOrderDetails?.find(
// (cartItem) =>
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName
// ); // check if the item is already in the cart
// const isItemInCartHoldfilter = CartOrderDetails?.filter(
// (cartItem) =>
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// !(
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName
// )
// ); // check if the item is already in the cart
// const holddataproduct = ReorderProductData?.filter(
// (cartItem) =>
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId
// );
// let totalSelectedProductQty = holddataproduct?.reduce(
// (accumulator, card) => {
// return (
// accumulator +
// parseInt(
// card?.StockAvailable === 'Y'
// ? props?.Productdata?.SinglePc === 'Y'
// ? card.SinglePc !== 'Y'
// ? card.OrderQty * card.NoOfPcs
// : card.OrderQty
// : card.SinglePc !== 'Y'
// ? card.OrderQty
// : card.OverAllPcs % card.NoOfPcs >= card.OrderQty
// ? 0
// : card.OrderQty % card.NoOfPcs === 0
// ? Math.floor(card.OrderQty / card.NoOfPcs)
// : Math.floor(card.OrderQty / card.NoOfPcs) + 1
// : 0
// )
// );
// },
// 0
// );
// let OverallQuantityhold =
// CalculateOverallQty(isItemInCartHold, isItemInCartHoldfilter) +
// totalSelectedProductQty;
// const OtherorderDataforNormalWithoutSalesId = CartOrderDetails?.filter(
// (cartItem) =>
// !(
// cartItem?.ProdId === props?.Productdata?.ProdId &&
// cartItem?.InwardDtlId === props?.Productdata?.InwardDtlId &&
// cartItem?.OrderRate === props?.Productdata?.OrderRate &&
// cartItem?.BookingTypeName === props?.Productdata?.BookingTypeName
// )
// );
// if (parseInt(Quantity) === 0 || Quantity === '') {
// setMessageType('error');
// setMessageData('Please enter valid quantity');
// setQuantity('');
// }
// else {
// if (isItemInCart && BookingTypeProd != 'Dine In' && OrderType != 'Hold') {
// if (isItemInCart?.StockAvailable === 'Y') {
// let Condition = OverallQuantity >= Quantity;
// if (Condition) {
// const UpdatedCartItem = await createUpdatedCartItem(
// isItemInCart,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherorderDataforNormal
// );
// await dispatch(changeOrderCardDetails(Cartdata));
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// } else {
// setMessageType('error');
// setMessageData('Stock Not Available');
// setQuantity('');
// }
// } else {
// if (
// isItemInCart &&
// BookingTypeProd != 'Dine In' &&
// OrderType != 'Hold'
// ) {
// const UpdatedCartItem = createUpdatedCartItem(
// isItemInCart,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherorderDataforNormal
// );
// await dispatch(changeOrderCardDetails(Cartdata));
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// }
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// }
// }
// else if (isItemInCartHold && OrderType === 'Hold') {
// if (isItemInCartHold?.StockAvailable === 'Y') {
// let Condition = OverallQuantityhold >= Quantity;
// if (Condition) {
// const UpdatedCartItem = createUpdatedCartItem(
// isItemInCartHold,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherorderDataforNormalWithoutSalesId
// );
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// await dispatch(changeOrderCardDetails(Cartdata));
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// } else {
// setMessageType('error');
// setMessageData('Stock Not Available');
// setQuantity('');
// }
// } else {
// if (isItemInCartHold && OrderType === 'Hold') {
// const UpdatedCartItem = createUpdatedCartItem(
// isItemInCartHold,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherorderDataforNormalWithoutSalesId
// );
// await dispatch(changeOrderCardDetails(Cartdata));
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// }
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// }
// }
// else if (
// isItemInCart &&
// BookingTypeProd === 'Dine In' &&
// OrderType != 'Hold'
// ) {
// if (isItemInCart?.StockAvailable === 'Y') {
// let Condition = OverallQuantity >= Quantity;
// if (Condition) {
// const UpdatedCartItem = createUpdatedCartItem(
// isItemInCart,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherOrderDatas
// );
// await dispatch(
// changeOrderCardDetails([...OtherOrderDatawithsales, ...Cartdata])
// );
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// } else {
// setMessageType('error');
// setMessageData('Stock Not Available');
// setQuantity('');
// }
// }
// else {
// if (
// isItemInCart &&
// BookingTypeProd === 'Dine In' &&
// OrderType != 'Hold'
// ) {
// const UpdatedCartItem = createUpdatedCartItem(
// isItemInCart,
// Quantity,
// NewPrice
// );
// const Cartdata = MergecardItem(
// UpdatedCartItem,
// BillOrderPre,
// OtherorderDataforNormal
// );
// await dispatch(changeOrderCardDetails(Cartdata));
// if (OfferCheckedInSetup && preferenceOffer) {
// await applyOffer(Cartdata);
// } else {
// dispatch(changeOrderCardDetails(Cartdata));
// }
// }
// props.handleEditQuantityCancel();
// setClearQuantity(false);
// }
// }
// }
// };
const CloseModal = () => {
props.handleEditQuantityCancel();
setClearQuantity(false);
@ -3706,6 +3425,33 @@ const BSBillingEditQuantity = (props) => {
setPackageDtl(data || []);
};
const handleWeightCalculation = async (data) => {
const { price, quantity } = data;
setQuantity(quantity);
setEditedPrice(price);
await handleWeightSubmit(quantity, price);
};
const handleWeightSubmit = async (qty, price) => {
await dispatch(changeHoldOrderDtl(false));
await dispatch(changePreviousOrderLength(CartOrderDetails?.length));
let localId = props.Index;
let editedProductIndex = CartOrderDetails?.findIndex(
(e) => e?.localId == localId
);
const editedProduct = {
...CartOrderDetails[editedProductIndex],
OrderQty: qty
};
await handleEditQuantity(editedProduct, editedProductIndex, editedProduct.OrderRate, qty);
props.handleEditQuantityCancel();
setClearQuantity(false);
};
const isKg =
props?.Productdata?.Size == 1 &&
["KG", "KGS"].includes(props?.Productdata?.UomName?.toUpperCase());
return (
<div className="BSBilling-EditQuantity-Modal">
<Messages
@ -3802,6 +3548,19 @@ const BSBillingEditQuantity = (props) => {
>
Packing
</button>
{isKg && (<button
type="button"
className={
RadioBtnSelection === 'AddWeight'
? 'SelecBtn AddWeight'
: 'ChangeBtn'
}
onClick={() => onRadioBtnChange('AddWeight')}
>
Add Weight
</button>)}
</div>
{RadioBtnSelection == 'Quantity' && (
@ -4007,6 +3766,15 @@ const BSBillingEditQuantity = (props) => {
/>
</>
)}
{RadioBtnSelection == 'AddWeight' && (
<>
<WeightCalculatePrice
CartOrderDetails={CartOrderDetails}
itemData={ItemData}
onSubmit={handleWeightCalculation}
/>
</>
)}
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
{((RadioBtnSelection == 'Price' && disableSubmitButton) ||
RadioBtnSelection == 'Quantity') && (

View File

@ -0,0 +1,134 @@
import { useState, useEffect, useRef } from 'react';
import { InputField } from '../../../../../Components/Forms/InputField.jsx';
import { Form } from 'antd';
import Buttons from '../../../../../Components/Forms/Buttons.jsx';
import { ArrowRightOutlined } from '@ant-design/icons';
const WeightCalculatePrice = ({ itemData, CartOrderDetails, onSubmit }) => {
const [enteredPrice, setEnteredPrice] = useState('');
const [calculatedQty, setCalculatedQty] = useState(0);
const priceInputRef = useRef(null);
const [form] = Form.useForm();
const basePrice = parseFloat(itemData?.OrderRate || itemData?.SellingPrice || 0);
useEffect(() => {
setTimeout(() => {
const inputElement = priceInputRef.current?.querySelector('input');
if (inputElement) {
inputElement.focus();
}
}, 100);
}, []);
// Calculate quantity based on entered price
const handlePriceChange = (e) => {
const value = e.target.value;
setEnteredPrice(value);
if (value && basePrice > 0) {
const price = parseFloat(value);
const qty = price / basePrice;
setCalculatedQty(qty);
} else {
setCalculatedQty(0);
}
};
const handleSubmit = (e) => {
if (e && e.preventDefault) {
e.preventDefault();
}
if (enteredPrice && calculatedQty > 0) {
console.log('Submitting weight calculation:', {
price: parseFloat(enteredPrice),
quantity: calculatedQty,
});
// Pass the calculated values back to parent component
if (onSubmit) {
onSubmit({
price: parseFloat(enteredPrice),
quantity: calculatedQty,
});
}
}
};
return (
<div className="weight-calculate-price">
<Form
form={form}
onFinish={handleSubmit}
onSubmitCapture={(e) => e.preventDefault()}
>
<div className="weight-info">
<div className="product-details">
<p><strong>Product:</strong> {itemData?.ProdName}</p>
<p><strong>Variant:</strong> {itemData?.ProdVariantName}</p>
<p><strong>Base Price:</strong> {basePrice.toFixed(2)} per {itemData?.UomName || 'unit'}</p>
</div>
</div>
<Form.Item
name="enteredPrice"
rules={[
{
required: true,
message: 'Please enter the price',
},
{
pattern: /^[1-9]\d*(\.\d+)?$/,
message: 'Please enter a valid price',
},
]}
>
<InputField
ref={priceInputRef}
label="Enter Amount (₹)"
value={enteredPrice}
onChange={handlePriceChange}
autocomplete="off"
inputMode="decimal"
placeholder="Enter price amount"
onInput={(e) => {
const cleanedValue = e.target.value.replace(/[^0-9.]/g, '');
const parts = cleanedValue.split('.');
e.target.value =
parts.length > 2
? `${parts[0]}.${parts.slice(1).join('')}`
: cleanedValue;
}}
/>
</Form.Item>
<div className="calculated-quantity-display">
<div className="quantity-row">
<label className="quantity-label">Calculated Quantity:</label>
<span className="quantity-value">
{calculatedQty > 0 ? calculatedQty.toFixed(3) : '0.000'} {itemData?.UomName || 'units'}
</span>
</div>
{calculatedQty > 0 && (
<div className="total-display">
<label>Total Amount:</label>
<span>{parseFloat(enteredPrice || 0).toFixed(2)}</span>
</div>
)}
</div>
<div className="submit-button-container">
<Buttons
buttonText="Apply"
color="901D77"
htmlType="button"
handleSubmit={handleSubmit}
icon={<ArrowRightOutlined />}
/>
</div>
</Form>
</div>
);
};
export default WeightCalculatePrice;

View File

@ -505,7 +505,8 @@ export default function BST1Payment() {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -1994,7 +1995,8 @@ export default function BST1Payment() {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -539,7 +539,8 @@ const BSBillingTable2 = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2034,7 +2035,8 @@ const BSBillingTable2 = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -534,7 +534,8 @@ const BSBillingTable3Pay = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0), //sree
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2180,7 +2181,8 @@ const BSBillingTable3Pay = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate, //sri
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -591,7 +591,8 @@ const BSBilling4Payment = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2062,7 +2063,8 @@ const BSBilling4Payment = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -579,7 +579,8 @@ const BSBillingTable5 = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2077,7 +2078,8 @@ const BSBillingTable5 = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -551,7 +551,8 @@ const BST6Payment = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2118,7 +2119,8 @@ const BST6Payment = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -570,7 +570,8 @@ const BSBilling7Payment = () => {
useEffect(() => {
if (!preOrder) {
const totalSum = OrderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -2086,7 +2087,8 @@ const BSBilling7Payment = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,

View File

@ -841,7 +841,8 @@ const StandardTablePayment = () => {
if (!preOrder) {
const totalSum = orderCardDetail?.reduce(
(acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
// (acc, card) => acc + parseFloat(card.OrderRate * card.OrderQty || 0),
(acc, card) => acc + parseFloat(card.TotalAmt || 0),
0
);
@ -1417,7 +1418,8 @@ const StandardTablePayment = () => {
Type: a.Type,
OrderQty: a.OrderQty,
OrderRate: a.OrderRate,
TotalAmt: a.OrderQty * a.OrderRate,
// TotalAmt: a.OrderQty * a.OrderRate,
TotalAmt: a.TotalAmt,
TaxAmt: a.TaxAmt,
RefundQty: 0,
InwardDtlId: a.InwardDtlId,