13/05/26 - 17h

branche_01062025
Cherif 2026-05-13 17:21:34 +02:00
parent 88e13597ee
commit da5232200d
8 changed files with 1736 additions and 755 deletions

View File

@ -271,9 +271,11 @@ const AddParnerClient = (props) => {
);
}
function ExpandableCell_String_to_monetaire({ value }) {
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
@ -328,73 +330,6 @@ const AddParnerClient = (props) => {
{ field: 'commentaire', headerName: 'commentaire', flex: 1, editable: false, hide: false, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{
field: "delete", headerName: 'Supprimer', disableExport: true,
renderCell: (cellValues) => {
return (
<div style={{ width: '100%', textAlign: 'center' }}>
{String(props.check_user_acces_right("facture", "write")) === "1" &&
cellValues.row.invoice_header_type !== "brouillon" && <FcCancel />}
{String(props.check_user_acces_right("facture", "write")) === "1" &&
cellValues.row.invoice_header_type === "brouillon" && <Popup
trigger={<Button
onClick={(event) => {
// handleClick_delete(event, cellValues);
}}
>
<CiTrash />
</Button>}
modal
nested
position="center center"
>
{close => (
<div>
<button className="gest_close" onClick={close}>
&times;
</button>
<div className="gest_header"> MySy Information </div>
<div className="gest_content">
{' '}
En confirmant cette opération, le document sera <i><font color="red"> définitivement supprimé</font></i>. <br />
</div>
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
// Delete_Draft_Invoice_Header_AndLine_Data(event, cellValues);
//console.log('modal closed ');
close();
}}> Valider </button>
</div>
<div style={{ "width": "45%", "float": "right" }}>
<button
className="gest_bton_popup_annuler"
onClick={() => {
//console.log('modal closed ');
close();
}}
>
Annuler
</button>
</div>
</div>
</div>
)}
</Popup>}
</div>
);
}
}
]
function sleep(ms) {
@ -5345,6 +5280,9 @@ const AddParnerClient = (props) => {
</Button>
{<Button variant="outlined" onClick={submenu_activite} className="detail_submenu client_menu" id='submenu_activite' name='submenu_activite'>Activités</Button>}
<Button variant="outlined" onClick={submenu_paiement} className="detail_submenu client_menu" id='submenu_paiement' name='submenu_paiement'>Paiements</Button>
<Button variant="outlined" onClick={submenu_relance} className="detail_submenu client_menu" id='submenu_relance' name='submenu_relance'>Relances</Button>
<Button variant="outlined" onClick={submenu_piece_jointe} className="detail_submenu client_menu" id='submenu_piece_jointe' name='submenu_piece_jointe'>Pièces Jointes</Button>
<Button variant="outlined" className="detail_submenu client_menu" id='submenu_factures' name='submenu_factures'
@ -5376,8 +5314,7 @@ const AddParnerClient = (props) => {
</Button>
<Button variant="outlined" onClick={submenu_paiement} className="detail_submenu client_menu" id='submenu_paiement' name='submenu_paiement'>Paiements</Button>
<Button variant="outlined" onClick={submenu_relance} className="detail_submenu client_menu" id='submenu_relance' name='submenu_relance'>Relances</Button>
</div>
@ -6854,182 +6791,6 @@ const AddParnerClient = (props) => {
</div>}
{String(submenu).trim() === "submenu_paiement" && <div className="training_data">
Total Paiement - {local_format_monetaire(New_Get_All_Paiement_Total_Payed)} * Paiement en attente --- * paiement en retard<br />
<div className="div_row" style={{ "border": "None", paddingRight: '10px' }}>
<div className="session_data">
{/*rowss_total_data && rowss_total_data.length > 0 && rowss_total_data.map((val) => (<nav style={{ "textAlign": 'right', 'marginRight': '15px', "fontWeight": "600", "fontSize": "15px", "paddingTop": "2px" }}> {parseFloat(String(val.somme_header_ca_ht)).toLocaleString()} (€) HT/ {val.nb_header_invoice} Factures </nav>))*/}
<div style={{ "border": "None" }}>
<div style={{ height: 550, width: '100%', paddingRight: '5px' }}>
&nbsp;
<Box
sx={{
height: 500,
width: '100%',
paddingRight: '1px',
// Gestion des cellule "statut"
'& .cell--status--encours': {
backgroundColor: '#E6F7C8',
color: '#1a3e72',
fontWeight: 'light',
},
'& .cell--status--traite': {
backgroundColor: '#E6CEAA',
color: '#F9E79F',
fontWeight: 'light',
},
/*"& .MuiDataGrid-virtualScrollerRenderZone": {
"& .MuiDataGrid-row": {
"&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" }
}
},*/
"& .MuiDataGrid-columnHeaders": {
backgroundColor: "#dfe8f2",
color: "#0a2a4d",
fontSize: '14px',
fontFamily: 'DM Sans',
},
"& .MuiDataGrid-renderingZone, .MuiDataGrid-root .MuiDataGrid-row": {
width: '100%',
},
'& .line--statut--selected': {
backgroundColor: '#e9f7f1',
color: '#0a2a4d',
},
'& .line--statut--pair': {
backgroundColor: 'rgba(235, 235, 235, .7)',
color: '#0a2a4d',
},
'& .line--statut--impair': {
backgroundColor: '#FFFFFF',
color: '#0a2a4d',
},
'& .line--statut--payed': {
backgroundColor: '#EAFAF1',
color: '#239B56',
fontWeight: '700'
},
}}
>
<DataGrid
components={{
Toolbar: CustomToolbar
}}
componentsProps={{ toolbar: { data_colums: columns_paiement } }}
checkboxSelection
disableSelectionOnClick
onSelectionModelChange={(newSelectionModel) => {
setselectionModel_paiement(newSelectionModel);
/*if (newSelectionModel.length === 1)
handleClick_edit_invoice_From_Line(newSelectionModel);*/
if (newSelectionModel.length !== 1) {
//clean_order_detail_fields();
//setsubmenu();
// setdisplay_detail_invoice();
}
}}
onRowDoubleClick={(newSelectionModel) => {
}
}
selectionModel={selectionModel_paiement}
localeText={frFR.components.MuiDataGrid.defaultProps.localeText}
rows={Get_All_Paiement_of_Client_result.map((item, index) => (
{
id: index,
_id: JSON.parse(item)._id,
invoice_id: JSON.parse(item).invoice_id,
paiement_amount: JSON.parse(item).paiement_amount,
paiement_mode: JSON.parse(item).paiement_mode,
paiement_ref: JSON.parse(item).paiement_ref,
paiement_date: JSON.parse(item).paiement_date,
commentaire: JSON.parse(item).commentaire,
client_id: JSON.parse(item).client_id,
invoice_ref: JSON.parse(item).invoice_ref,
}
))}
columns={columns_paiement}
pageSize={10}
className="datagridclass"
rowsPerPageOptions={[10]}
//disableSelectionOnClick
/* components={{
Toolbar: GridToolbar,
}}*/
//sx={datagridSx}
getCellClassName={(params) => {
}}
getRowClassName={(params) => {
if (parseInt(parseFloat(params.row.reste_to_paye)) <= 0 && String(params.row.invoice_header_type) === "facture") {
return 'line--statut--payed';
}
// Pour la gestion de la couleur de zone double cliquée
if (String(params.row.id) === String(gridline_id_paiement)) {
return 'line--statut--selected';
}
else if (parseInt(String(params.row.id)) % 2 === 0) {
return 'line--statut--pair';
}
else if (parseInt(String(params.row.id)) % 2 !== 0) {
return 'line--statut--impair';
}
}}
/>
</Box>
<br />
</div>
</div>
</div>
ICIII FAIRE UN HISTOGRAMME DES PAIEMENT SUR LES 6 DERNIMER MOIS
</div>
</div>}
{String(submenu).trim() === "submenu_relance" && <div className="training_data">
submenu_relance <br />
<Module_Relance_Client_Facture
client_id={props.client_id} />
</div>}
</div>}
&nbsp;
@ -7623,7 +7384,7 @@ const AddParnerClient = (props) => {
<h3 style={{ color: '#0a2a4d' }}>{p_client_raison_sociale}</h3>
<div className="client-badges" style={{ color: '#0a2a4d' }}>
<span className="badge badge-green">{p_client_is_company === "1" && "Entreprise"} {p_client_is_company !== "1" && "Particulier"} </span>
<span className="badge badge-orange">Compte prioritaire</span>
{p_detail_archive && String(p_detail_archive) === "1" && <span className="badge badge-orange">Archivé</span>}
</div>
</div>
@ -9124,6 +8885,184 @@ const AddParnerClient = (props) => {
</div>}
{String(submenu).trim() === "submenu_paiement" && <div>
{Get_All_Paiement_of_Client_result && Get_All_Paiement_of_Client_result.length > 0 &&
<div className="div_row" style={{ "border": "None", paddingRight: '10px' }}>
<h3 className="mysy_h3" style={{ textAlign: 'center', color: 'green' }}>Total Paiement - {local_format_monetaire(New_Get_All_Paiement_Total_Payed)}</h3>
<div className="session_data" style={{ background: '#FFF' }}>
<div style={{ "border": "None" }}>
<div style={{ height: 550, width: '100%', paddingRight: '5px' }}>
&nbsp;
<Box
sx={{
height: 500,
width: '100%',
paddingRight: '1px',
// Gestion des cellule "statut"
'& .cell--status--encours': {
backgroundColor: '#E6F7C8',
color: '#1a3e72',
fontWeight: 'light',
},
'& .cell--status--traite': {
backgroundColor: '#E6CEAA',
color: '#F9E79F',
fontWeight: 'light',
},
/*"& .MuiDataGrid-virtualScrollerRenderZone": {
"& .MuiDataGrid-row": {
"&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" }
}
},*/
"& .MuiDataGrid-columnHeaders": {
backgroundColor: "#dfe8f2",
color: "#0a2a4d",
fontSize: '14px',
fontFamily: 'DM Sans',
},
"& .MuiDataGrid-renderingZone, .MuiDataGrid-root .MuiDataGrid-row": {
width: '100%',
},
'& .line--statut--selected': {
backgroundColor: '#e9f7f1',
color: '#0a2a4d',
},
'& .line--statut--pair': {
backgroundColor: 'rgba(235, 235, 235, .7)',
color: '#0a2a4d',
},
'& .line--statut--impair': {
backgroundColor: '#FFFFFF',
color: '#0a2a4d',
},
'& .line--statut--payed': {
backgroundColor: '#EAFAF1',
color: '#239B56',
fontWeight: '700'
},
}}
>
<DataGrid
components={{
Toolbar: CustomToolbar
}}
componentsProps={{ toolbar: { data_colums: columns_paiement } }}
// checkboxSelection
disableSelectionOnClick
onSelectionModelChange={(newSelectionModel) => {
setselectionModel_paiement(newSelectionModel);
/*if (newSelectionModel.length === 1)
handleClick_edit_invoice_From_Line(newSelectionModel);*/
if (newSelectionModel.length !== 1) {
//clean_order_detail_fields();
//setsubmenu();
// setdisplay_detail_invoice();
}
}}
onRowDoubleClick={(newSelectionModel) => {
}
}
selectionModel={selectionModel_paiement}
localeText={frFR.components.MuiDataGrid.defaultProps.localeText}
rows={Get_All_Paiement_of_Client_result.map((item, index) => (
{
id: index,
_id: JSON.parse(item)._id,
invoice_id: JSON.parse(item).invoice_id,
paiement_amount: JSON.parse(item).paiement_amount,
paiement_mode: JSON.parse(item).paiement_mode,
paiement_ref: JSON.parse(item).paiement_ref,
paiement_date: JSON.parse(item).paiement_date,
commentaire: JSON.parse(item).commentaire,
client_id: JSON.parse(item).client_id,
invoice_ref: JSON.parse(item).invoice_ref,
}
))}
columns={columns_paiement}
pageSize={10}
className="datagridclass"
rowsPerPageOptions={[10]}
//disableSelectionOnClick
/* components={{
Toolbar: GridToolbar,
}}*/
//sx={datagridSx}
getCellClassName={(params) => {
}}
getRowClassName={(params) => {
if (parseInt(parseFloat(params.row.reste_to_paye)) <= 0 && String(params.row.invoice_header_type) === "facture") {
return 'line--statut--payed';
}
// Pour la gestion de la couleur de zone double cliquée
if (String(params.row.id) === String(gridline_id_paiement)) {
return 'line--statut--selected';
}
else if (parseInt(String(params.row.id)) % 2 === 0) {
return 'line--statut--pair';
}
else if (parseInt(String(params.row.id)) % 2 !== 0) {
return 'line--statut--impair';
}
}}
/>
</Box>
<br />
</div>
</div>
</div>
</div>}
{!Get_All_Paiement_of_Client_result || Get_All_Paiement_of_Client_result.length > 0 &&
<div>
Aucun paiement
</div>}
</div>}
{String(submenu).trim() === "submenu_relance" && <div>
<Module_Relance_Client_Facture
client_id={props.client_id}
client_12_retard_a_payer={client_12_retard_a_payer} />
</div>}
</div>
@ -10641,4 +10580,9 @@ position: relative;
.elyos-btn-secondary {
width: 100%;
}
.mysy_h3 {
margin: 0;
font-size: 25px;
letter-spacing: -0.04em;
}
`;

View File

@ -266,18 +266,20 @@ const DisplayPartnerPromotion = (props) => {
function ExpandableCell_String_to_monetaire({ value }) {
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(number);
}
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}

View File

@ -309,18 +309,20 @@ const DisplayPartnerSession = (props) => {
function ExpandableCell_String_to_monetaire({ value }) {
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(number);
}
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}
@ -848,9 +850,9 @@ const DisplayPartnerSession = (props) => {
{ field: 'nom', headerName: 'Nom', minWidth: 200, flex: 1, hide: false, editable: false, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'prenom', headerName: 'Prénom', minWidth: 200, flex: 1, hide: false, editable: false, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'email', headerName: 'Email', minWidth: 200, flex: 1, flex: 1, renderCell: (params) => <ExpandableCell_50 {...params} />, editable: false,},
{ field: 'email', headerName: 'Email', minWidth: 200, flex: 1, flex: 1, renderCell: (params) => <ExpandableCell_50 {...params} />, editable: false, },
{ field: 'telephone', headerName: 'Téléphone', minWidth: 150, flex: 1, flex: 1, renderCell: (params) => <ExpandableCell_50 {...params} />, editable: false,},
{ field: 'telephone', headerName: 'Téléphone', minWidth: 150, flex: 1, flex: 1, renderCell: (params) => <ExpandableCell_50 {...params} />, editable: false, },
{ field: 'client_rattachement_nom', headerName: 'Client', minWidth: 150, flex: 1, hide: false, editable: false, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'client_rattachement_id', headerName: 'Client_id', Width: 0, hide: true, editable: false, },
@ -924,66 +926,66 @@ const DisplayPartnerSession = (props) => {
}
},
/* {
field: "update", headerName: 'Mise à jour',
renderCell: (cellValues) => {
return (
<>
{String(props.check_user_acces_right("session", "write")) === "1" && <Popup
trigger={<Button
onClick={(event) => {
handleClick_accept(event, cellValues);
}}
/* {
field: "update", headerName: 'Mise à jour',
renderCell: (cellValues) => {
return (
<>
{String(props.check_user_acces_right("session", "write")) === "1" && <Popup
trigger={<Button
onClick={(event) => {
handleClick_accept(event, cellValues);
}}
>
<FcAcceptDatabase />
</Button>}
modal
nested
position="center center"
>
<FcAcceptDatabase />
</Button>}
modal
nested
position="center center"
>
{close => (
<div>
<button className="gest_close" onClick={close}>
&times;
</button>
<div className="gest_header"> MySy Information </div>
<div className="gest_content">
{' '}
Confirmer la mise à jour des informations du stagiaire
</div>
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
handleClick_update_data(event, cellValues);
close();
}}> Valider </button>
{close => (
<div>
<button className="gest_close" onClick={close}>
&times;
</button>
<div className="gest_header"> MySy Information </div>
<div className="gest_content">
{' '}
Confirmer la mise à jour des informations du stagiaire
</div>
<div style={{ "width": "45%", "float": "right" }}>
<button
className="gest_bton_popup_annuler"
onClick={() => {
//console.log('modal closed ');
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
handleClick_update_data(event, cellValues);
close();
}}
>
Annuler
</button>
}}> Valider </button>
</div>
<div style={{ "width": "45%", "float": "right" }}>
<button
className="gest_bton_popup_annuler"
onClick={() => {
//console.log('modal closed ');
close();
}}
>
Annuler
</button>
</div>
</div>
</div>
</div>
)}
</Popup>}
</>
);
}
},
*/
)}
</Popup>}
</>
);
}
},
*/
{
field: 'bton_vertif', headerName: 'Gestion', minWidth: 50, flex: 1, maxWidth: 100, hideable: true, hide: false, editable: false, align: "center",
@ -12679,7 +12681,11 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
console.warn('Update_Comment_Given_Emargement : Not good man :( mysearchtext = ' + error);
setUpdate_Comment_Given_Emargement_api("false");
alert(" Impossible de mettre à jour l'émargement");
setdisplay_alert_mysy("1");
setalert_message(" Impossible de mettre à jour l'émargement");
setalert_type("error");
})
@ -12733,7 +12739,11 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
console.warn('Delete_List_Emargement : Not good man :( mysearchtext = ' + error);
setDelete_List_Emargement_api("false");
alert(" Impossible de supprimer les demandes d'émargement");
setdisplay_alert_mysy("1");
setalert_message(" Impossible de supprimer les demandes d'émargement");
setalert_type("error");
})
@ -12777,15 +12787,21 @@ const DisplayPartnerSession = (props) => {
if (file_type !== "application/pdf") {
alert("Le fichier n'est pas de type PDF");
setdisplay_alert_mysy("1");
setalert_message("Le fichier n'est pas de type PDF");
setalert_type("error");
return;
}
if (file_size > 10000000) {
alert("Le fichier ne doit pas depasser un 1 Méga octets");
console.log("Le fichier ne doit pas depasser un 1 Méga octets");
setdisplay_alert_mysy("1");
setalert_message("Le fichier ne doit pas depasser un 1 Méga octets");
setalert_type("error");
return;
}
@ -13433,7 +13449,11 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
console.warn('Not good man :( Get_Stagiaire_List_Email_Com = ', error);
setGet_Stagiaire_List_Email_Com_api("false");
alert("Impossible de récupérer les adresses email de communication");
setdisplay_alert_mysy("1");
setalert_message("Impossible de récupérer les adresses email de communication");
setalert_type("error");
//setmyApimyApiMessage("")
})
}
@ -15338,7 +15358,10 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
console.warn('Not good man :( Get_List_Stagiaire_Convocations = ', error);
setGet_List_Stagiaire_Convocations_api("false");
alert("Impossible de récupérer les modèles de convocations");
setdisplay_alert_mysy("1");
setalert_message("Impossible de récupérer les modèles de convocations");
setalert_type("error");
//setmyApimyApiMessage("")
})
}
@ -15433,7 +15456,11 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
console.warn('Not good man :( Send_Stagiaire_Convocations_By_Email = ', error);
setSend_Stagiaire_Convocations_By_Email_api("false");
alert("Impossible d'envoyer la convocation par email");
setdisplay_alert_mysy("1");
setalert_message("Impossible d'envoyer la convocation par email");
setalert_type("error");
//setmyApimyApiMessage("")
})
}
@ -15479,7 +15506,12 @@ const DisplayPartnerSession = (props) => {
setLoading(false);
//console.log(" In Download_Stagiaire_Conventions_PDF res.data = " + res.data);
if (String(res.data) === String("false")) {
alert("Impossible de télécharger la convocation (2) ");
setdisplay_alert_mysy("1");
setalert_message("Impossible de télécharger la convocation (2) ");
setalert_type("error");
} else {
fileDownload(res.data, nom_fichier_cmd);
Getall_Editable_Document_By_Partner_By_Collection();
@ -15490,7 +15522,10 @@ const DisplayPartnerSession = (props) => {
}).catch((error) => {
setLoading(false);
console.error('Error:', error);
alert(" Impossible de télécharger la convocation ")
setdisplay_alert_mysy("1");
setalert_message(" Impossible de télécharger la convocation ");
setalert_type("error");
});
@ -25458,7 +25493,7 @@ const DisplayPartnerSession = (props) => {
<div style={{ "border": "None" }}>
<h3 style={{ fontFamily: 'DM Sans' }}> Affichage planning </h3>
&nbsp;
<div style={{ "width": "98%", "marginLeft": "5px", }}>
<FullCalendar
height={550}

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,12 @@ import { AiOutlinePlusCircle } from "react-icons/ai";
import FiberNewIcon from '@mui/icons-material/FiberNew';
import {
Clock3,
CheckCircle2,
Ban,
Archive
} from "lucide-react";
import Dialog from '@mui/material/Dialog';
import DialogActions from '@mui/material/DialogActions';
@ -1243,41 +1249,8 @@ const PartnerClient_Activite_For_Client = (props) => {
/******* kanban */
const [kanban_colonne_width, setkanban_colonne_width] = useState("20vw");
const [kanban_colonne_width, setkanban_colonne_width] = useState("17vw");
// MySy Comment : design d'une tache (couleur, taille, etc)
const classes_old = {
board: {
display: "flex",
margin: "0 auto",
width: "100%",
fontFamily: 'Arial, "Helvetica Neue", sans-serif'
},
column: {
// minWidth: 200,
//width: "16vw",
width: kanban_colonne_width,
height: "80vh",
margin: "0 auto",
backgroundColor: "#212F3D",
border: 'double #32a1ce',
},
columnHead: {
textAlign: "center",
padding: 10,
fontSize: "1.2em",
backgroundColor: "#C6D8AF",
border: "red",
},
item: {
padding: 10,
margin: 10,
fontSize: "0.8em",
cursor: "pointer",
backgroundColor: "white"
}
};
const classes = {
board: {
@ -1290,12 +1263,21 @@ const PartnerClient_Activite_For_Client = (props) => {
// minWidth: 200,
//width: "16vw",
width: kanban_colonne_width,
textAlign: "center",
height: "80vh",
margin: "0 auto",
backgroundColor: "#FFFFFF",
border: 'solid 1px',
borderLeft: "1px solid #ecf1fc",
borderRight: "1px solid #ecf1fc",
borderRadius: "24px",
backgroundColor: "rgba(255, 255, 255, 0.68)",
border: "1px solid rgba(221, 229, 239, 0.8)",
boxShadow: "var(--shadow-lg)",
overflow: "hidden",
backdropFilter: "blur(10px)",
fontFamily: "'DM Sans', Arial, Helvetica, sans-serif",
marginLeft: "30px",
},
@ -1303,11 +1285,21 @@ const PartnerClient_Activite_For_Client = (props) => {
// minWidth: 200,
//width: "16vw",
width: kanban_colonne_width,
textAlign: "center",
height: "80vh",
margin: "0 auto",
backgroundColor: "#FFFFFF",
border: 'solid 1px',
borderTop: 'none',
borderRadius: "24px",
backgroundColor: "rgba(255, 255, 255, 0.68)",
border: "1px solid rgba(221, 229, 239, 0.8)",
boxShadow: "var(--shadow-lg)",
overflow: "hidden",
backdropFilter: "blur(10px)",
fontFamily: "'DM Sans', Arial, Helvetica, sans-serif",
marginLeft: "30px",
// borderRight: "1px solid #ecf1fc",
},
@ -1316,23 +1308,72 @@ const PartnerClient_Activite_For_Client = (props) => {
// minWidth: 200,
//width: "16vw",
width: kanban_colonne_width,
textAlign: "center",
height: "80vh",
margin: "0 auto",
backgroundColor: "#FFFFFF",
border: "1px solid #ecf1fc",
borderRight: 'solid 1px',
borderBottom: 'solid 1px',
borderRadius: "24px",
backgroundColor: "rgba(255, 255, 255, 0.68)",
border: "1px solid rgba(221, 229, 239, 0.8)",
boxShadow: "var(--shadow-lg)",
overflow: "hidden",
backdropFilter: "blur(10px)",
fontFamily: "'DM Sans', Arial, Helvetica, sans-serif",
marginLeft: "30px",
},
columnHead: {
columnHead_Encours: {
textAlign: "center",
padding: 5,
fontSize: "14px",
backgroundColor: "rgb(103, 164, 239)",
border: "1px solid",
border: "none",
marginBottom: "5px",
background: "linear-gradient(180deg, #eef4ff 0%, #f7faff 100%)",
fontSize: "17px",
color: "#0f2552",
fontWeight: 600,
padding: "18px 18px 16px",
},
columnHead_Fait: {
textAlign: "center",
padding: 5,
border: "none",
marginBottom: "5px",
background: "linear-gradient(180deg, #edfdf4 0%, #f8fffb 100%)",
fontSize: "17px",
color: "#0f2552",
fontWeight: 600,
padding: "18px 18px 16px",
},
columnHead_Annule: {
textAlign: "center",
padding: 5,
border: "none",
marginBottom: "5px",
background: "linear-gradient(180deg, #fff5e9 0%, #fffaf3 100%)",
fontSize: "17px",
color: "#0f2552",
fontWeight: 600,
padding: "18px 18px 16px",
},
columnHead_Archivé: {
textAlign: "center",
padding: 5,
border: "none",
marginBottom: "5px",
background: "linear-gradient(180deg, #f2f6fb 0%, #f9fbfd 100%)",
fontSize: "17px",
color: "#0f2552",
fontWeight: 600,
padding: "18px 18px 16px",
},
item: {
padding: 5,
marginBottom: 10,
@ -1790,201 +1831,22 @@ const PartnerClient_Activite_For_Client = (props) => {
<div className="div_row">
{String(show_all_activite_list) === "1" && String(showactivite_detail) !== "1" && String(add_one_activite) !== "1" &&
<div className="div_row" style={{ "marginLeft": "5px", "marginRight": "5px" }}>
<div className="div_row" onClick={Add_Activite} style={{ "cursor": "pointer" }}> <AiOutlinePlusCircle /> Ajouter une activité </div>
{/*
<div className="div_row" style={{ "border": "None" }}>
<div className="titre1" > Activité(s) qui me sont Assignée(s) </div>
<button className="btn btn-primary"
onClick={(e) => {
Add_Activite();
}}>
Ajout 1 Activité
</button>
</div>
<div className="div_row">
<DndProvider backend={HTML5Backend}>
<section style={classes.board}>
{activite_status_list_pave_affiche.map((channel, index) => (
<KanbanColumn
key={channel.id}
status={channel.id}
changeTaskStatus={changeTaskStatus}
>
{String(index) === "0" && <div style={classes.column_first_left}>
<div className="kanban_header_css">{Opportunite_chanel_label[channel.id]} </div>
<div style={{ overflowY: 'auto', height: '95%' }}>
{Get_List_Activite_Assign_To_Me_result && Get_List_Activite_Assign_To_Me_result.length > 0 &&
Get_List_Activite_Assign_To_Me_result.filter(item => JSON.parse(item).status === channel.id)
.map(item => (
<KanbanItem key={JSON.parse(item)._id} id={JSON.parse(item)._id} actvite_recid={JSON.parse(item).recid}>
<br />
<div className="kanban_item_css" id={JSON.parse(item)._id}
>
{String(String(JSON.parse(item).status)) === "1" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
<i>FAIT </i> <br />
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
{String(String(JSON.parse(item).status)) === "0" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
{JSON.parse(item).employee_assigned_view_statut && String(JSON.parse(item).employee_assigned_view_statut) !== "1" &&
<nav style={{ marginRight: "10px", textAlign: "right" }}> <FiberNewIcon style={{ color: 'red', }} /> </nav>}
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
{parseInt(String(JSON.parse(item).retard)) < 0 && <i style={{ "color": "red", }}> RETARD de {String(JSON.parse(item).retard)} jours <br /></i>}
{parseInt(String(JSON.parse(item).retard)) > 0 && <i> DANS {String(JSON.parse(item).retard)} jours <br /></i>}
{parseInt(String(JSON.parse(item).retard)) == 0 && <i style={{ "color": "orange" }}> AUJOURD'HUI <br /></i>}
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
{String(String(JSON.parse(item).status)) === "-1" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
<i>ANNULE </i> <br />
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
</div>
</KanbanItem>
))}
</div>
</div>}
{String(index) !== "0" && <div style={classes.column_right_solid_border}>
<div className="kanban_header_css">{Opportunite_chanel_label[channel.id]} </div>
<div style={{ overflowY: 'auto', height: '95%' }}>
{Get_List_Activite_Assign_To_Me_result && Get_List_Activite_Assign_To_Me_result.length > 0 &&
Get_List_Activite_Assign_To_Me_result.filter(item => JSON.parse(item).status === channel.id)
.map(item => (
<KanbanItem key={JSON.parse(item)._id} id={JSON.parse(item)._id} actvite_recid={JSON.parse(item).recid}>
<br />
<div className="kanban_item_css" id={JSON.parse(item)._id}
>
{String(String(JSON.parse(item).status)) === "1" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
<i>FAIT </i> <br />
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
{String(String(JSON.parse(item).status)) === "0" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
{JSON.parse(item).employee_assigned_view_statut && String(JSON.parse(item).employee_assigned_view_statut) !== "1" &&
<nav style={{ marginRight: "10px", textAlign: "right" }}> <FiberNewIcon style={{ color: 'red', }} /> </nav>}
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
{parseInt(String(JSON.parse(item).retard)) < 0 && <i style={{ "color": "red", }}> RETARD de {String(JSON.parse(item).retard)} jours <br /></i>}
{parseInt(String(JSON.parse(item).retard)) > 0 && <i> DANS {String(JSON.parse(item).retard)} jours <br /></i>}
{parseInt(String(JSON.parse(item).retard)) == 0 && <i style={{ "color": "orange" }}> AUJOURD'HUI <br /></i>}
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
{String(String(JSON.parse(item).status)) === "-1" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item).recid));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
<i>ANNULE </i> <br />
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
</div>
</KanbanItem>
))}
</div>
</div>}
{/* <div className="div_row" onClick={Add_Activite} style={{ "cursor": "pointer" }}> <AiOutlinePlusCircle /> Ajouter une activité </div>*/}
</KanbanColumn>
))}
</section>
</DndProvider>
<div className="div_row"> &nbsp;</div>
</div>
*/}
@ -1998,7 +1860,9 @@ const PartnerClient_Activite_For_Client = (props) => {
changeTaskStatus={changeTaskStatus}
>
{String(index) === "0" && <div style={classes.column_first_left}>
<div style={classes.columnHead}>{Opportunite_chanel_label[channel.id]}</div>
{Opportunite_chanel_label[channel.id] === "Encours" && <div style={classes.columnHead_Encours}><Clock3 size={18} /> &nbsp; {Opportunite_chanel_label[channel.id]}</div>}
<div style={{ overflowY: 'auto', height: '95%' }}>
{Get_List_Activite_Of_client_Part_result && Get_List_Activite_Of_client_Part_result.length > 0 &&
Get_List_Activite_Of_client_Part_result.filter(item => JSON.parse(item).status === channel.id)
@ -2078,7 +1942,11 @@ const PartnerClient_Activite_For_Client = (props) => {
</div>}
{String(index) !== "0" && <div style={classes.column_right_solid_border}>
<div style={classes.columnHead}>{Opportunite_chanel_label[channel.id]}</div>
{Opportunite_chanel_label[channel.id] === "Fait" && <div style={classes.columnHead_Fait}><CheckCircle2 size={18} /> &nbsp;{Opportunite_chanel_label[channel.id]} </div>}
{Opportunite_chanel_label[channel.id] === "Annulé" && <div style={classes.columnHead_Annule}><Ban size={18} /> &nbsp; {Opportunite_chanel_label[channel.id]}</div>}
{Opportunite_chanel_label[channel.id] === "Archivé" && <div style={classes.columnHead_Archivé}><Archive size={18} /> &nbsp; {Opportunite_chanel_label[channel.id]}</div>}
<div style={{ overflowY: 'auto', height: '95%' }}>
{Get_List_Activite_Of_client_Part_result && Get_List_Activite_Of_client_Part_result.length > 0 &&
Get_List_Activite_Of_client_Part_result.filter(item => JSON.parse(item).status === channel.id)
@ -2086,9 +1954,7 @@ const PartnerClient_Activite_For_Client = (props) => {
<KanbanItem key={JSON.parse(item)._id} id={JSON.parse(item)._id} actvite_recid={JSON.parse(item).recid}>
<br />
<div className="kanban_item_css" id={JSON.parse(item)._id}
>
<div className={`kanban_item_css-${channel.id}`} id={JSON.parse(item)._id}>
{String(String(JSON.parse(item).status)) === "1" &&
<nav recid={String(JSON.parse(item).recid)}
@ -2150,6 +2016,24 @@ const PartnerClient_Activite_For_Client = (props) => {
</nav>
</nav>}
{String(String(JSON.parse(item).status)) === "2" &&
<nav recid={String(JSON.parse(item).recid)}
onClick={(event) => {
Display_Given_Activite_From_Activite_Recid(String(JSON.parse(item)._id));
setDialog_ACTIVITE_open(true);
}}
className="detail_activite">
<nav className="detail_header" recid={String(JSON.parse(item).recid)} > {String(JSON.parse(item).deadline)} : {String(JSON.parse(item).type)}</nav>
<nav recid={String(JSON.parse(item).recid)} >
<i>ARCHIVE </i> <br />
{(JSON.parse(item).description).substring(0, 50)}<br />
{(JSON.parse(item).detail).substring(0, 50)}<br />
</nav>
</nav>}
</div>
</KanbanItem>
@ -2613,13 +2497,13 @@ const PartnerClient_Activite_For_Client = (props) => {
<div className="div_row" style={{ "border": "None" }}>
<Button variant="outlined" onClick={Add_Activite} style={{ "width": '20rem' }}
className="detail_class_submenu bton_add_session"
id='menu_import_participant' name='menu_import_participant'>Ajout 1 Activité &nbsp;
<IoAddCircleOutline style={{ "fontSize": "x-large", "color": "green" }} />
</Button>
<button className="btn btn-primary"
onClick={(e) => {
Add_Activite();
}}>
Ajout 1 Activité
</button>
</div>
<div className="div_row"> &nbsp;</div>
</div>
@ -2732,4 +2616,127 @@ width: 100%;
.react-datepicker-wrapper{
width: 100%;
}
.kanban_item_css{
position: relative;
background: rgba(255, 255, 255, 0.96);
border: 1px solid #edf2f8;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
padding: 16px;
overflow: hidden;
cursor: move !important;
overflow: hidden;
cursor: move !important;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
}
.kanban_item_css-0{
padding: 5px;
margin-bottom: 10px;
font-size: 0.8em;
cursor: move;
background: #f4f6f6;
border: 0px solid;
border-left-width: 0px;
width: 94%;
margin-left: 3%;
min-height: 5rem;
border-left-width: 10px;
border-left-color : #f3f7ff;
overflow: hidden;
cursor: move !important;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
}
.kanban_item_css-1{
padding: 5px;
margin-bottom: 10px;
font-size: 0.8em;
cursor: move;
background: #f4f6f6;
border: 0px solid;
border-left-width: 0px;
width: 94%;
margin-left: 3%;
min-height: 5rem;
border-left-width: 10px;
border-left-color : #4d6a58;
overflow: hidden;
cursor: move !important;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
}
.kanban_item_css--1{
padding: 5px;
margin-bottom: 10px;
font-size: 0.8em;
cursor: move;
background: #f4f6f6;
border: 0px solid;
border-left-width: 0px;
width: 94%;
margin-left: 3%;
min-height: 5rem;
border-left-width: 10px;
border-left-color : #F5C527;
overflow: hidden;
cursor: move !important;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
}
.kanban_item_css-2{
padding: 5px;
margin-bottom: 10px;
font-size: 0.8em;
cursor: move;
background: #f4f6f6;
border: 0px solid;
border-left-width: 0px;
width: 94%;
margin-left: 3%;
min-height: 5rem;
border-left-width: 10px;
border-left-color : #bfd7f5;
overflow: hidden;
cursor: move !important;
border-radius: 18px;
box-shadow: 0 4px 14px rgba(17, 39, 76, 0.06);
}
.btn {
height: 42px;
border-radius: 12px;
padding: 0 18px;
border: 1px solid var(--border);
display: inline-flex;
align-items: center;
gap: 9px;
font-weight: 700;
cursor: pointer;
background: #fff;
color: var(--text);
transition: 0.18s ease;
}
.btn:hover {
transform: translateY(-1px);
box-shadow: 0 10px 24px rgba(16, 66, 119, 0.1);
}
.btn-primary {
background: #0b55c4;
color: #fff;
border-color: #0b55c4;
}
.btn-light {
background: rgba(255, 255, 255, 0.86);
}
`;

View File

@ -187,18 +187,20 @@ const Partner_Commande = (props) => {
function ExpandableCell_String_to_monetaire({ value }) {
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
}).format(number);
}
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}

View File

@ -250,18 +250,20 @@ const Partner_Facture = (props) => {
}
function ExpandableCell_String_to_monetaire({ value }) {
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}

View File

@ -218,18 +218,20 @@ const Partner_Facture_ARG = (props) => {
}
function ExpandableCell_String_to_monetaire({ value }) {
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(value);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}
var new_val = String(value).replaceAll(" ", '');
const [expanded, setExpanded] = React.useState(false);
const number = parseFloat(new_val);
var new_value = ""
if (isNaN(number)) {
new_value = "—"
} else {
new_value = new Intl.NumberFormat('fr-FR', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
}).format(number);
}