26/04/26 - 19h

branche_01062025
Cherif 2026-04-26 19:25:30 +02:00
parent 81f33d4875
commit 88f378a07a
10 changed files with 17174 additions and 1509 deletions

View File

@ -4710,7 +4710,7 @@ const AddParnerClient = (props) => {
</Button>
{<Button variant="outlined" onClick={submenu_activite} className="detail_submenu client_menu" id='submenu_activite' name='submenu_activite'>Activité</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_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'

View File

@ -6742,7 +6742,7 @@ const Module_Session_Planification = (props) => {
...newValue.filter((i) => fixedVal_grp_apprenant.indexOf(i) === -1),
]);
console.log(" ### val_grp_apprenant = ", val_grp_apprenant)
// console.log(" ### val_grp_apprenant = ", val_grp_apprenant)
}}
value={val_grp_apprenant}

View File

@ -5356,7 +5356,7 @@ const Partner = (props) => {
</div>
}
{String(menu) === "monactivite" && <div className="div_droite div_droite_ralonge">
<PartnerClientActivite conntected_employee_id={conntected_employee_id} check_user_acces_right={check_user_acces_right}
email={conntected_employee_email} related_collection={"partnair_account"} update_nb_activite_en_retard={update_nb_activite_en_retard}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -748,7 +748,7 @@ const PartnerClient_Activite_For_Client = (props) => {
var new_dead_line_format = "";
if (typeof p_activite_deadline == "object") {
var act_deadline = format(p_activite_deadline, 'dd/MM/yyyy');
var act_deadline = format(p_activite_deadline, 'dd/MM/yyyy HH:mm:ss');
new_dead_line_format = act_deadline;
} else {
new_dead_line_format = p_activite_deadline;
@ -881,7 +881,7 @@ const PartnerClient_Activite_For_Client = (props) => {
setp_activite_deadline_label(mylocalclient_activite.deadline);
}
else
setp_activite_deadline(new Date());
setp_activite_deadline(moment().format("DD/MM/YYYY HH:mm:ss"));
if (mylocalclient_activite.employee_assigned_to_id) {
@ -1001,7 +1001,7 @@ const PartnerClient_Activite_For_Client = (props) => {
setp_activite_deadline_label(mylocalclient_activite.deadline);
}
else
setp_activite_deadline(new Date());
setp_activite_deadline(moment().format("DD/MM/YYYY HH:mm:ss"));
if (mylocalclient_activite.employee_assigned_to_id) {
@ -1152,7 +1152,7 @@ const PartnerClient_Activite_For_Client = (props) => {
function Clear_activite_P_fields() {
setp_activite_description("");
setp_activite_detail("");
setp_activite_deadline(new Date());
setp_activite_deadline(moment().format("DD/MM/YYYY HH:mm:ss"));
setp_activite_type("");
setp_activite_status("0");
setp_activite_status_label("");
@ -1559,16 +1559,18 @@ const PartnerClient_Activite_For_Client = (props) => {
selected={new Date(moment(p_activite_deadline, "DD/MM/YYYY HH:mm:ss"))}
onChange={(date) => {
setp_activite_deadline(format(date, 'dd/MM/yyyy'));
setp_activite_deadline(format(date, 'dd/MM/yyyy HH:mm:ss'));
setdatamodification_activite("1");
}
}
showTimeSelect={false}
filterTime={filterPassedTime_start}
dateFormat="dd/MM/yyyy"
className="disabled_style_100_percent_row"
locale={'fr'}
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
dateFormat="dd/MM/yyyy HH:mm"
is24Hour
className="disabled_style enable_style"
/>
</div>
@ -1956,7 +1958,7 @@ const PartnerClient_Activite_For_Client = (props) => {
</div>
*/}
<div className="div_row">
<DndProvider backend={HTML5Backend}>
@ -2175,11 +2177,13 @@ const PartnerClient_Activite_For_Client = (props) => {
setdatamodification_activite("1");
}
}
showTimeSelect={false}
filterTime={filterPassedTime_start}
dateFormat="dd/MM/yyyy"
className="disabled_style enable_style"
locale={'fr'}
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
dateFormat="dd/MM/yyyy HH:mm"
is24Hour
className="disabled_style enable_style"
/>
</div>}
@ -2408,15 +2412,17 @@ const PartnerClient_Activite_For_Client = (props) => {
selected={new Date(moment(one_activite_deadline, "DD/MM/YYYY HH:mm:ss"))}
onChange={(date) => {
setone_activite_deadline(format(date, 'dd/MM/yyyy'));
setone_activite_deadline(format(date, 'dd/MM/yyyy HH:mm:ss'));
}
}
showTimeSelect={false}
filterTime={filterPassedTime_start}
dateFormat="dd/MM/yyyy"
className="disabled_style enable_style"
locale={'fr'}
showTimeSelect
timeFormat="HH:mm"
timeIntervals={15}
dateFormat="dd/MM/yyyy HH:mm"
is24Hour
className="disabled_style enable_style"
/>
@ -2587,9 +2593,113 @@ const PartnerClient_Activite_For_Client = (props) => {
</div>
<div className="div_row"> &nbsp;</div>
</div>
<style>{local_css}</style>
</div >
)
}
export default PartnerClient_Activite_For_Client;
export default PartnerClient_Activite_For_Client;
const local_css = `
:root {
--bg: #f6f8fb;
--card: #ffffff;
--text: #0f172a;
--muted: #64748b;
--border: #e5e7eb;
--shadow: 0 10px 25px rgba(2, 6, 23, .06);
--green-700: #0f6b53;
--green-600: #167a5e;
--green-100: #e9f7f1;
--blue-600: #2563eb;
--radius: 14px;
--radius-sm: 10px;
}
.Grid_2_col{
margin-top: 12px;
display:grid;
grid-template-columns: 1.2fr 1fr;
gap: 14px;
padding:5px;
}
.Grid_1_col{
margin-top: 12px;
display:grid;
grid-template-columns: 1fr;
gap: 14px;
padding:5px;
}
.Grid_2_col_sub_colone {
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 14px;
box-shadow: 0 6px 18px rgba(2,6,23,.04);
padding: 0px;
display: flex;
flex-direction: column;
gap: 14px;
}
.Grid_2_col_sub_colone_header {
background: #dbeafe;
border-top-right-radius: 10px;
border-top-left-radius: 10px;
text-align: center;
font-family: DM Sans;
font-weight: 700;
height: 2rem;
padding-top: 5px;
font-size: 15px;
}
.Grid_2_col_sub_colone_bottom_menu{
}
.card__header{
background: #e2e8f0;
font-size: small;
text-align: center;
}
.card__title{
display:flex;
align-items:center;
gap: 10px;
}
.card__icon{
width: 34px;
height: 34px;
display:grid;
place-items:center;
border-radius: 12px;
background:#eff6ff;
border:1px solid #dbeafe;
}
.card__header h2{
margin:0;
font-size: 15px;
letter-spacing: -0.01em;
}
.card__actions{ display:flex; align-items:center; gap:8px; }
.block_detail_action{
width: 100%;
float: left;
background: #fafafa;
padding: 10px;
border: unset;
border-radius: 10px;
}
.react-datepicker-wrapper{
width: 100%;
}
`;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -84,6 +84,38 @@ import { IconButton } from '@material-ui/core';
import CancelPresentationIcon from '@mui/icons-material/CancelPresentation';
import Module_Alert_Confirmation from "./Module_Alert_Confirmation";
import {
LayoutDashboard,
CalendarDays,
Users,
GraduationCap,
Receipt,
BookOpen,
BarChart3,
Settings,
FileText,
CreditCard,
AlertCircle,
Pencil,
Search,
RotateCcw,
Download,
Columns3,
Filter,
AlignJustify,
Printer,
Send,
History,
XCircle,
ChevronRight,
ChevronDown,
Bell,
Eye,
MoreVertical,
FolderOpen,
Menu,
} from "lucide-react";
function PaperComponent(props) {
return (
<Draggable
@ -252,11 +284,38 @@ const Partner_Facture = (props) => {
const columns = [
{ field: '_id', headerName: '_id', hide: true, disableExport: true, },
{ field: 'id', headerName: 'id', hide: true, disableExport: true },
{ field: 'eye_status', headerName: 'eye_status',hide: true, disableExport: true },
{ field: 'eye_echeance', headerName: 'eye_echeance', hide: true, disableExport: true },
{
field: 'local_status', headerName: 'Statut', width: 150, hide: false, editable: false,
renderCell: (cellValues) => {
return (
<div style={{ paddingLeft: "5px", paddingRight: "15px", "display": "block", wordBreak: "break-all" }}>
{cellValues.row.eye_status && cellValues.row.eye_status === "retard" && <font style={{ color: "red" }}> En retard </font>}
</div>
);
}
},
{ field: 'invoice_header_ref_interne', headerName: 'Num Facture', minWidth: 200, flex: 1, hide: false, editable: false, },
{ field: 'order_header_ref_interne', headerName: 'Réf. Cmd', minWidth: 200, flex: 1, hide: true, editable: false },
{ field: 'invoice_header_type', headerName: 'Type', width: 100, hide: false, editable: false },
{ field: 'invoice_date', headerName: 'Date Facture', width: 150, hide: false, editable: false },
{ field: 'invoice_date_echeance', headerName: 'Echéance', width: 150, hide: false, editable: false },
{
field: 'invoice_date_echeance', headerName: 'Echéance', width: 150, hide: false, editable: false,
renderCell: (cellValues) => {
return (
<div style={{ paddingLeft: "5px", paddingRight: "15px", "display": "block", wordBreak: "break-all" }}>
{cellValues.row.eye_echeance && parseFloat(cellValues.row.eye_echeance) < 7 && <font style={{ color: "orange" }}> {cellValues.row.invoice_date_echeance} </font>}
{!cellValues.row.eye_echeance || parseFloat(cellValues.row.eye_echeance) >= 7 && <font> {cellValues.row.invoice_date_echeance} </font>}
</div>
);
}
},
{ field: 'order_header_client_id', headerName: 'Client_Id', width: 150, hide: true, editable: false, disableExport: true },
{ field: 'order_header_client_nom', headerName: 'Nom Client', minWidth: 150, flex: 1 },
@ -2402,6 +2461,7 @@ const Partner_Facture = (props) => {
if (facture_mail_type && facture_mail_type === "aquited") {
form.append("invoice_regeneration", "1");
form.append("invoice_aquite", "1");
}
for (let i = 0; i < tab_invoice_mail_pieces_jointes_result.length; i++) {
@ -4362,7 +4422,7 @@ const Partner_Facture = (props) => {
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("archive", "0");
form.append("is_ftion_initiale", "2");
form.append("is_ftion_initiale", "2");
var myurl = process.env.REACT_APP_API_URL + "myclass/api/get_partner_class/";
@ -5349,6 +5409,46 @@ const Partner_Facture = (props) => {
})
}
const stats = [
{
id: 1,
title: "Factures émises",
value: "337",
trend: "+12% vs mois dernier",
trendType: "positive",
icon: <FileText size={22} />,
iconClass: "is-blue",
},
{
id: 2,
title: "À payer",
value: "18 900,00 €",
trend: "+8% vs mois dernier",
trendType: "positive",
icon: <CreditCard size={22} />,
iconClass: "is-amber",
},
{
id: 3,
title: "En retard",
value: "4 800,00 €",
trend: "+3% vs mois dernier",
trendType: "negative",
icon: <AlertCircle size={22} />,
iconClass: "is-red",
},
{
id: 4,
title: "Brouillons",
value: "8",
trend: "Stable vs mois dernier",
trendType: "neutral",
icon: <Pencil size={22} />,
iconClass: "is-purple",
},
];
return (
<div className="partner_facture">
@ -5955,7 +6055,7 @@ const Partner_Facture = (props) => {
{article_formation_ou_produit && String(article_formation_ou_produit) === "formation" &&
<div>
<div className="div_row" style={{ "width": "100%", }}>
{New_GetCurrentPartnerClass_result && New_GetCurrentPartnerClass_result.length > 0 &&
(p_add_line_item || String(p_add_line_item) === "") && String(p_detail_header_statut_label).toLowerCase() !== "facturé" &&
<div className="session_caract_Dialog" style={{ "textAlign": "left", "width": "50%", "height": "5rem", "float": "left" }}> <b> Formation </b>
@ -5966,7 +6066,7 @@ const Partner_Facture = (props) => {
fullWidth
disabled={Boolean(parseInt(is_document_invoiced))}
options={New_GetCurrentPartnerClass_result}
value={New_GetCurrentPartnerClass_result.filter((data) => (data).internal_url === String(p_add_line_item))[0].label}
value={New_GetCurrentPartnerClass_result.filter((data) => (data).internal_url === String(p_add_line_item))[0].label}
onChange={(event, value) => {
// setp_champ_table(value.nom_champ_technique);
@ -6384,7 +6484,7 @@ const Partner_Facture = (props) => {
<div className="div_row" style={{ "width": "100%", }}>
{String(p_detail_header_statut_label).toLowerCase() === "facturé" && <div className="session_caract_Dialog" style={{ "textAlign": "left", "width": "50%", "height": "5rem", "float": "left" }}> <b>Article </b>
{New_Getall_Partner_Product_Service_result && New_Getall_Partner_Product_Service_result.length > 0 && <TextField
autoFocus
margin="dense"
@ -8706,7 +8806,7 @@ const Partner_Facture = (props) => {
setdisplay_detail_invoice("");
Getall_Parter_Invoice_With_Filter();
console.log(" éééé ")
}}
>Rechercher
</Button>
@ -8728,6 +8828,51 @@ const Partner_Facture = (props) => {
<br />
</div>
<div className="div_row" style={{ "border": "None", paddingRight: '10px' }}>
<section className="stats-grid">
<div className="stat-card">
<div className={'stat-card__icon is-blue'}><FileText size={22} /></div>
<div className="stat-card__content">
<span className="stat-card__label">Factures émises</span>
{rowss_total_data.length > 0 && rowss_total_data[0].nb_header_invoice && <strong className="stat-card__value">{rowss_total_data[0].nb_header_invoice}</strong>}
</div>
</div>
<div className="stat-card">
<div className={'stat-card__icon is-amber'}><CreditCard size={22} /></div>
<div className="stat-card__content">
<span className="stat-card__label">Non échues</span>
{rowss_total_data.length > 0 && rowss_total_data[0].total_a_payer && <strong className="stat-card__value">{local_format_monetaire(String(rowss_total_data[0].total_a_payer))} TTC</strong>}
</div>
</div>
<div className="stat-card">
<div className={'stat-card__icon is-red'}><AlertCircle size={22} /></div>
<div className="stat-card__content">
<span className="stat-card__label">En retard </span>
{rowss_total_data.length > 0 && rowss_total_data[0].total_en_retard && <strong className="stat-card__value">{local_format_monetaire(String(rowss_total_data[0].total_en_retard))} TTC</strong>}
</div>
</div>
<div className="stat-card">
<div className={'stat-card__icon is-purple'}><Pencil size={22} /></div>
<div className="stat-card__content">
<span className="stat-card__label">Brouillons</span>
{rowss_total_data.length > 0 && rowss_total_data[0].nb_header_invoice_bouillon && <strong className="stat-card__value">{String(rowss_total_data[0].nb_header_invoice_bouillon)}</strong>}
</div>
</div>
</section>
</div>
<div className="div_row" style={{ "border": "None", paddingRight: '10px' }}>
<div className="session_data">
@ -8755,9 +8900,6 @@ const Partner_Facture = (props) => {
fontWeight: 'light',
},
/*"& .MuiDataGrid-virtualScrollerRenderZone": {
"& .MuiDataGrid-row": {
"&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" }
@ -8862,6 +9004,9 @@ const Partner_Facture = (props) => {
credit_note_ref: JSON.parse(item).credit_note_ref,
invoice_header_origin: JSON.parse(item).invoice_header_origin,
eye_status: JSON.parse(item).eye_status,
eye_echeance: JSON.parse(item).eye_echeance,
}
))}
@ -8945,6 +9090,8 @@ const Partner_Facture = (props) => {
</div>
<div className="div_row" ref={myRef} id="myRef" > &nbsp;</div>
{String(display_detail_invoice) === "1" &&
<div className="div_row" style={{ "border": "None", paddingRight: '10px' }}>
@ -10867,4 +11014,50 @@ width: 100%;
margin: 0px !important;
width: 100% !important;
}
.stats-grid { display: grid; grid-template-columns: repeat(4, minmax(180px, 1fr)); gap: 18px; margin-bottom: 18px;align-content: center;
align-items: center; }
.stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; display: flex; align-items: center; gap: 16px; box-shadow: var(--shadow-card); }
.stat-card__icon { width: 58px; height: 58px; border-radius: 18px; display: grid; place-items: center; flex-shrink: 0; }
.stat-card__content { display: flex; flex-direction: column; gap: 4px; }
.stat-card__label { color: var(--text-soft); font-size: 14px; font-weight: 600; }
.stat-card__value { font-size: 18px; line-height: 1.1; color: #0a2a4d; font-family: 'DM Sans'; }
.stat-card__trend { font-size: 13px; font-weight: 600; }
.stat-card__trend.positive { color: var(--success); }
.stat-card__trend.negative { color: var(--danger); }
.stat-card__trend.neutral { color: var(--text-faint); }
.stat-card__icon { width: 58px; height: 58px; border-radius: 18px; display: grid; place-items: center; flex-shrink: 0; }
:root {
--sidebar-bg: #072b46;
--sidebar-bg-2: #0b3556;
--sidebar-text: rgba(255, 255, 255, 0.88);
--sidebar-text-soft: rgba(255, 255, 255, 0.62);
--primary: #2d6df6;
--primary-dark: #1f59d1;
--primary-soft: #e9f0ff;
--success: #1fa971;
--success-soft: #e9f8f2;
--warning: #f59e0b;
--warning-soft: #fff4df;
--danger: #ef4444;
--danger-soft: #feecec;
--purple: #8b5cf6;
--purple-soft: #f2ecff;
--text: #16324f;
--text-soft: #6a7f95;
--text-faint: #8fa1b5;
--border: #e7edf5;
--background: #f5f8fc;
--surface: #ffffff;
--surface-2: #fbfdff;
--radius-lg: 18px;
--shadow-card: 0 8px 24px rgba(15, 45, 74, 0.06);
--shadow-soft: 0 4px 12px rgba(15, 45, 74, 0.04);
}
.is-blue { background: #eaf1ff; color: var(--primary); }
.is-amber { background: #fff3df; color: var(--warning); }
.is-red { background: #fdeaea; color: var(--danger); }
.is-purple { background: #f0eafe; color: var(--purple); }
`;

View File

@ -276,6 +276,7 @@
color: black;
width: 100%;
height: 2rem !important;
min-width: auto !important;
}
@ -883,6 +884,7 @@
color: black;
width: 100%;
height: 2rem !important;
min-width: auto !important;
}
@ -1513,6 +1515,7 @@
color: black;
width: 100%;
height: 2rem !important;
min-width: auto !important;
}
@ -2059,6 +2062,7 @@
color: black;
width: 100% !important;
height: 2rem !important;
min-width: auto !important;
}