Merge pull request 'added validation in customer master' (#255) from temp/customer-master-validation-fix into main

Reviewed-on: Pozomind/pozo-retail-app#255
This commit is contained in:
karthikalakshmi 2026-03-06 11:56:56 +05:30
commit fa9ff8b014
1 changed files with 124 additions and 106 deletions

View File

@ -1,4 +1,4 @@
import { useState, useEffect, useRef } from 'react'; import { useState, useEffect, useRef, useCallback } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import { InputField } from '../../Components/Forms/InputField.jsx'; import { InputField } from '../../Components/Forms/InputField.jsx';
import Buttons from '../../Components/Forms/Buttons.jsx'; import Buttons from '../../Components/Forms/Buttons.jsx';
@ -37,6 +37,7 @@ import { MdLocationOn, MdHome } from 'react-icons/md';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { ApplicationPreferences } from '../../Features/BrachLogin/BranchLogin.js'; import { ApplicationPreferences } from '../../Features/BrachLogin/BranchLogin.js';
import { IoMdAddCircleOutline } from 'react-icons/io'; import { IoMdAddCircleOutline } from 'react-icons/io';
import { isIndianMobile } from '../../utils/calculations.js';
const subDirectory = import.meta.env.BASE_URL; const subDirectory = import.meta.env.BASE_URL;
@ -354,57 +355,41 @@ const CustomerForm = ({ formType }) => {
//post data //post data
const onFinish = async (values) => { const onFinish = async (values) => {
let postData = values; try {
console.log(postData, 'postData'); let postData = values;
console.log(postData, 'postData');
// Handle address data - use only the addresses from addressesList const validMobile = isIndianMobile(postData?.CustMobile);
const addedAddresses = addressesList || []; if (!validMobile) {
setMessageType('warning');
// Only include addresses that have Address1 and Zip setMessageData('Please enter a valid Indian mobile number.');
const validAddresses = addedAddresses.filter( return;
(addr) => addr?.Address1 && addr?.Zip
);
postData['CustomerAddressDtl'] = validAddresses;
postData['CreatedBy'] = UserId;
postData['CompId'] = CompId;
postData['BranchId'] = BranchId;
postData['UserId'] = GetUserId;
// postData["OutStandingAmount"] = parseInt(values?.OutStandingAmount);
postData['InitialOutStanding'] = parseInt(values?.OutStandingAmount);
postData['Document'] = ImageUrl;
postData['CustomerProfile'] = ImageUrl ? ImageUrl : null;
postData['CreditDays'] =
selectedCredit === 'others' ? otherCreditValue : selectedCredit;
let response = {};
if (formType === 'add') {
// if (SelectedUserCreation === "N") {
postData['AppId'] = AppId;
// }
if (offerType) {
postData['OfferType'] = offerType;
}
if (Maritalstatus == 'N') {
postData['MarriedStatus'] = 'N';
postData['CustDOB'] = DobDate;
}
if (Maritalstatus == 'Y') {
postData['MarriedStatus'] = 'Y';
postData['CustDOB'] = DobDate;
postData['SpouseDOB'] = SpouseDobDate;
postData['AnniversaryDate'] = anniversaryDate;
} }
// Handle address data - use only the addresses from addressesList
const addedAddresses = addressesList || [];
response = await dispatch(postCust(postData)).unwrap(); // Only include addresses that have Address1 and Zip
} else if (formType === 'edit') { const validAddresses = addedAddresses.filter(
if (editstate) { (addr) => addr?.Address1 && addr?.Zip
postData['CustId'] = editstate?.CustId; );
postData['AddId'] = editstate?.CustAddId;
postData['AppId'] = editstate?.AppId; postData['CustomerAddressDtl'] = validAddresses;
postData['UpdatedBy'] = UserId;
postData['UserId'] = editstate?.UserId; postData['CreatedBy'] = UserId;
postData['CompId'] = CompId;
postData['BranchId'] = BranchId;
postData['UserId'] = GetUserId;
// postData["OutStandingAmount"] = parseInt(values?.OutStandingAmount);
postData['InitialOutStanding'] = parseInt(values?.OutStandingAmount);
postData['Document'] = ImageUrl;
postData['CustomerProfile'] = ImageUrl ? ImageUrl : null;
postData['CreditDays'] =
selectedCredit === 'others' ? otherCreditValue : selectedCredit;
let response = {};
if (formType === 'add') {
// if (SelectedUserCreation === "N") {
postData['AppId'] = AppId;
// }
if (offerType) { if (offerType) {
postData['OfferType'] = offerType; postData['OfferType'] = offerType;
} }
@ -418,22 +403,48 @@ const CustomerForm = ({ formType }) => {
postData['SpouseDOB'] = SpouseDobDate; postData['SpouseDOB'] = SpouseDobDate;
postData['AnniversaryDate'] = anniversaryDate; postData['AnniversaryDate'] = anniversaryDate;
} }
}
response = await dispatch(putCust(postData)).unwrap();
}
if (response?.data?.statusCode == 1) { response = await dispatch(postCust(postData)).unwrap();
navigate(`${subDirectory}setting/customer-master/`, { } else if (formType === 'edit') {
state: { if (editstate) {
Notiffy: { postData['CustId'] = editstate?.CustId;
messageType: 'success', postData['AddId'] = editstate?.CustAddId;
messageData: response?.data?.response, postData['AppId'] = editstate?.AppId;
postData['UpdatedBy'] = UserId;
postData['UserId'] = editstate?.UserId;
if (offerType) {
postData['OfferType'] = offerType;
}
if (Maritalstatus == 'N') {
postData['MarriedStatus'] = 'N';
postData['CustDOB'] = DobDate;
}
if (Maritalstatus == 'Y') {
postData['MarriedStatus'] = 'Y';
postData['CustDOB'] = DobDate;
postData['SpouseDOB'] = SpouseDobDate;
postData['AnniversaryDate'] = anniversaryDate;
}
}
response = await dispatch(putCust(postData)).unwrap();
}
if (response?.data?.statusCode == 1) {
navigate(`${subDirectory}setting/customer-master/`, {
state: {
Notiffy: {
messageType: 'success',
messageData: response?.data?.response,
},
}, },
}, });
}); } else {
} else { setMessageType('error');
setMessageType('error'); setMessageData(response?.data?.response);
setMessageData(response?.data?.response); }
} catch (error) {
// Validation error will stop submit
console.log("Validation Failed:", error);
} }
}; };
@ -841,12 +852,17 @@ const CustomerForm = ({ formType }) => {
); );
}; };
const onComplete = useCallback(() => {
setMessageType(null);
setMessageData(null);
}, []);
return ( return (
<div className="CustomerForm-Master"> <div className="CustomerForm-Master">
<div className="pageOverAll"> <div className="pageOverAll">
<div className="userPage userPageCustMaster"> <div className="userPage userPageCustMaster">
<div className="userPageContent"> <div className="userPageContent">
<Messages messageType={messageType} messageData={messageData} /> <Messages messageType={messageType} messageData={messageData} onComplete={onComplete} />
<div className="formName"> <div className="formName">
<FormHeader title={'Customer'} /> <FormHeader title={'Customer'} />
</div> </div>
@ -865,10 +881,12 @@ const CustomerForm = ({ formType }) => {
rules={[ rules={[
{ {
required: true, required: true,
pattern: /^\d{10}$/, message: "Please Enter Mobile Number",
message: 'Please Enter a Valid Mobile Number', },
{
pattern: /^[6-9]\d{9}$/,
message: "Please enter a valid mobile number",
}, },
{ validator: validatePhoneNumber }, { validator: validatePhoneNumber },
]} ]}
> >
@ -888,10 +906,10 @@ const CustomerForm = ({ formType }) => {
} }
inputMode="numeric" inputMode="numeric"
onInput={(e) => onInput={(e) =>
(e.target.value = e.target.value.replace( (e.target.value = e.target.value.replace(
/[^0-9]/g, /[^0-9]/g,
'' ''
)) ))
} }
/> />
</Form.Item> </Form.Item>
@ -987,15 +1005,15 @@ const CustomerForm = ({ formType }) => {
autocomplete="off" autocomplete="off"
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
formRef.current?.getFieldsValue()?.CustName != '' formRef.current?.getFieldsValue()?.CustName != ''
? true ? true
: false : false
} }
// isOnChange={ // isOnChange={
// formType == 'edit' || fieldChangeMap['CustName'] // formType == 'edit' || fieldChangeMap['CustName']
// ? true // ? true
// : false // : false
// } // }
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
@ -1031,7 +1049,7 @@ const CustomerForm = ({ formType }) => {
autocomplete="off" autocomplete="off"
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
fieldChangeMap['CustShortName'] fieldChangeMap['CustShortName']
? true ? true
: false : false
} }
@ -1076,9 +1094,9 @@ const CustomerForm = ({ formType }) => {
<p>Upload Profile</p> <p>Upload Profile</p>
<Form.Item <Form.Item
name="CustomerProfile" name="CustomerProfile"
// getValueFromEvent={(e) => // getValueFromEvent={(e) =>
// formType === 'edit' ? editstate?.EmpPhotoLink : e // formType === 'edit' ? editstate?.EmpPhotoLink : e
// } // }
> >
<Imageupload <Imageupload
singleImage={true} singleImage={true}
@ -1108,7 +1126,7 @@ const CustomerForm = ({ formType }) => {
autocomplete="off" autocomplete="off"
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
formRef.current?.getFieldsValue()?.CustEmail formRef.current?.getFieldsValue()?.CustEmail
? true ? true
: false : false
} }
@ -1133,7 +1151,7 @@ const CustomerForm = ({ formType }) => {
maxLength={15} maxLength={15}
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
formRef.current?.getFieldsValue()?.CustGSTIN formRef.current?.getFieldsValue()?.CustGSTIN
? true ? true
: false : false
} }
@ -1157,7 +1175,7 @@ const CustomerForm = ({ formType }) => {
autocapitalize="on" autocapitalize="on"
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
formRef.current?.getFieldsValue()?.StateCode formRef.current?.getFieldsValue()?.StateCode
? true ? true
: false : false
} }
@ -1173,13 +1191,13 @@ const CustomerForm = ({ formType }) => {
style={ style={
offerType == 'P' offerType == 'P'
? { ? {
opacity: '1', opacity: '1',
boxShadow: boxShadow:
'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px', 'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px',
margin: '3px', margin: '3px',
padding: '5px', padding: '5px',
backgroundColor: '#fff', backgroundColor: '#fff',
} }
: { opacity: '0.6', boxShadow: 'none' } : { opacity: '0.6', boxShadow: 'none' }
} }
onClick={() => { onClick={() => {
@ -1200,13 +1218,13 @@ const CustomerForm = ({ formType }) => {
style={ style={
offerType == 'F' offerType == 'F'
? { ? {
opacity: '1', opacity: '1',
boxShadow: boxShadow:
'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px', 'rgba(0, 0, 0, 0.05) 0px 6px 24px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px',
margin: '3px', margin: '3px',
padding: '5px', padding: '5px',
backgroundColor: '#fff', backgroundColor: '#fff',
} }
: { opacity: '0.6', boxShadow: 'none' } : { opacity: '0.6', boxShadow: 'none' }
} }
onClick={() => { onClick={() => {
@ -1384,7 +1402,7 @@ const CustomerForm = ({ formType }) => {
); );
}} }}
inputMode="numeric" inputMode="numeric"
// style={{ marginLeft: '10px', width: '120px' }} // style={{ marginLeft: '10px', width: '120px' }}
/> />
)} )}
<div> <div>
@ -1404,8 +1422,8 @@ const CustomerForm = ({ formType }) => {
autocomplete="off" autocomplete="off"
isOnChange={ isOnChange={
formType == 'edit' || formType == 'edit' ||
formRef.current?.getFieldsValue() formRef.current?.getFieldsValue()
?.CreditLimit ?.CreditLimit
? true ? true
: false : false
} }
@ -1932,7 +1950,7 @@ const CustomerForm = ({ formType }) => {
<Form.Item <Form.Item
name="State" name="State"
// rules={[{ required: true }]} // rules={[{ required: true }]}
> >
<InputField <InputField
field="State" field="State"
@ -2031,9 +2049,9 @@ const CustomerForm = ({ formType }) => {
prevlca={ prevlca={
editstate editstate
? { ? {
lat: editstate.Latitude, lat: editstate.Latitude,
lng: editstate.Longitude, lng: editstate.Longitude,
} }
: null : null
} }
/> />