fix: Update PrimeReact to v10.8.3 and fix all compilation errors
This commit is contained in:
@@ -18,6 +18,7 @@ import { Checkbox } from 'primereact/checkbox';
|
||||
import { factureService, clientService } from '../../../../../services/api';
|
||||
import { formatCurrency } from '../../../../../utils/formatters';
|
||||
import type { Facture, Client } from '../../../../../types/btp';
|
||||
import { StatutFacture, TypeFacture } from '../../../../../types/btp';
|
||||
|
||||
const FactureDuplicatePage = () => {
|
||||
const params = useParams();
|
||||
@@ -29,10 +30,10 @@ const FactureDuplicatePage = () => {
|
||||
numero: '',
|
||||
objet: '',
|
||||
description: '',
|
||||
type: 'FACTURE',
|
||||
statut: 'BROUILLON',
|
||||
dateEmission: new Date(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // +30 jours
|
||||
typeFacture: TypeFacture.FACTURE,
|
||||
statut: StatutFacture.BROUILLON,
|
||||
dateEmission: new Date().toISOString(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // +30 jours
|
||||
tauxTVA: 20,
|
||||
lignes: []
|
||||
});
|
||||
@@ -68,15 +69,16 @@ const FactureDuplicatePage = () => {
|
||||
|
||||
// Charger la facture originale
|
||||
const factureResponse = await factureService.getById(factureId);
|
||||
setOriginalFacture(factureResponse.data);
|
||||
|
||||
setOriginalFacture(factureResponse);
|
||||
|
||||
// Charger les clients
|
||||
const clientsResponse = await clientService.getAll();
|
||||
setClients(clientsResponse.data);
|
||||
|
||||
// Générer un nouveau numéro
|
||||
const numeroResponse = await factureService.generateNumero();
|
||||
setNewFacture(prev => ({ ...prev, numero: numeroResponse.data.numero }));
|
||||
setClients(clientsResponse);
|
||||
|
||||
// Générer un nouveau numéro basé sur la date
|
||||
const now = new Date();
|
||||
const numero = `FAC-${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}-${String(Math.floor(Math.random() * 10000)).padStart(4, '0')}`;
|
||||
setNewFacture(prev => ({ ...prev, numero }));
|
||||
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement:', error);
|
||||
@@ -92,12 +94,12 @@ const FactureDuplicatePage = () => {
|
||||
|
||||
const updateNewFacture = () => {
|
||||
if (!originalFacture) return;
|
||||
|
||||
|
||||
setNewFacture(prev => ({
|
||||
...prev,
|
||||
objet: `${originalFacture.objet} (Copie)`,
|
||||
description: originalFacture.description,
|
||||
type: originalFacture.type,
|
||||
typeFacture: originalFacture.typeFacture,
|
||||
tauxTVA: originalFacture.tauxTVA,
|
||||
client: copyClient ? originalFacture.client : undefined,
|
||||
lignes: copyLignes ? [...(originalFacture.lignes || [])] : [],
|
||||
@@ -241,7 +243,7 @@ const FactureDuplicatePage = () => {
|
||||
<strong>Objet:</strong> {originalFacture.objet}
|
||||
</div>
|
||||
<div className="mb-3">
|
||||
<strong>Type:</strong> {originalFacture.type}
|
||||
<strong>Type:</strong> {originalFacture.typeFacture}
|
||||
</div>
|
||||
<div className="mb-3">
|
||||
<strong>Client:</strong> {typeof originalFacture.client === 'string' ? originalFacture.client : originalFacture.client?.nom}
|
||||
@@ -293,9 +295,9 @@ const FactureDuplicatePage = () => {
|
||||
<label htmlFor="type" className="font-semibold">Type *</label>
|
||||
<Dropdown
|
||||
id="type"
|
||||
value={newFacture.type}
|
||||
value={newFacture.typeFacture}
|
||||
options={typeOptions}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, type: e.value }))}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, typeFacture: e.value }))}
|
||||
className="w-full"
|
||||
/>
|
||||
</div>
|
||||
@@ -321,8 +323,8 @@ const FactureDuplicatePage = () => {
|
||||
<label htmlFor="dateEmission" className="font-semibold">Date d'émission *</label>
|
||||
<Calendar
|
||||
id="dateEmission"
|
||||
value={newFacture.dateEmission}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, dateEmission: e.value || new Date() }))}
|
||||
value={newFacture.dateEmission ? new Date(newFacture.dateEmission) : null}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, dateEmission: (e.value as Date)?.toISOString() || new Date().toISOString() }))}
|
||||
className="w-full"
|
||||
dateFormat="dd/mm/yy"
|
||||
/>
|
||||
@@ -334,8 +336,8 @@ const FactureDuplicatePage = () => {
|
||||
<label htmlFor="dateEcheance" className="font-semibold">Date d'échéance *</label>
|
||||
<Calendar
|
||||
id="dateEcheance"
|
||||
value={newFacture.dateEcheance}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, dateEcheance: e.value || new Date() }))}
|
||||
value={newFacture.dateEcheance ? new Date(newFacture.dateEcheance) : null}
|
||||
onChange={(e) => setNewFacture(prev => ({ ...prev, dateEcheance: (e.value as Date)?.toISOString() || new Date().toISOString() }))}
|
||||
className="w-full"
|
||||
dateFormat="dd/mm/yy"
|
||||
/>
|
||||
|
||||
@@ -19,6 +19,7 @@ import { Divider } from 'primereact/divider';
|
||||
import { factureService, clientService } from '../../../../../services/api';
|
||||
import { formatCurrency } from '../../../../../utils/formatters';
|
||||
import type { Facture, LigneFacture, Client } from '../../../../../types/btp';
|
||||
import { StatutFacture, TypeFacture } from '../../../../../types/btp';
|
||||
|
||||
const FactureEditPage = () => {
|
||||
const params = useParams();
|
||||
@@ -29,10 +30,10 @@ const FactureEditPage = () => {
|
||||
numero: '',
|
||||
objet: '',
|
||||
description: '',
|
||||
type: 'FACTURE',
|
||||
statut: 'BROUILLON',
|
||||
dateEmission: new Date(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // +30 jours
|
||||
typeFacture: TypeFacture.FACTURE,
|
||||
statut: StatutFacture.BROUILLON,
|
||||
dateEmission: new Date().toISOString(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // +30 jours
|
||||
tauxTVA: 20,
|
||||
lignes: []
|
||||
});
|
||||
@@ -49,7 +50,7 @@ const FactureEditPage = () => {
|
||||
quantite: 1,
|
||||
unite: 'unité',
|
||||
prixUnitaire: 0,
|
||||
montantHT: 0
|
||||
montantLigne: 0
|
||||
});
|
||||
|
||||
const factureId = params.id as string;
|
||||
@@ -96,16 +97,17 @@ const FactureEditPage = () => {
|
||||
|
||||
// Charger les clients
|
||||
const clientsResponse = await clientService.getAll();
|
||||
setClients(clientsResponse.data);
|
||||
|
||||
setClients(clientsResponse);
|
||||
|
||||
if (!isNew) {
|
||||
// Charger la facture existante
|
||||
const factureResponse = await factureService.getById(factureId);
|
||||
setFacture(factureResponse.data);
|
||||
setFacture(factureResponse);
|
||||
} else {
|
||||
// Générer un nouveau numéro
|
||||
const numeroResponse = await factureService.generateNumero();
|
||||
setFacture(prev => ({ ...prev, numero: numeroResponse.data.numero }));
|
||||
// Générer un nouveau numéro basé sur la date
|
||||
const now = new Date();
|
||||
const numero = `FAC-${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}-${String(Math.floor(Math.random() * 10000)).padStart(4, '0')}`;
|
||||
setFacture(prev => ({ ...prev, numero }));
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
@@ -122,11 +124,11 @@ const FactureEditPage = () => {
|
||||
|
||||
const calculateMontants = () => {
|
||||
if (!facture.lignes) return;
|
||||
|
||||
const montantHT = facture.lignes.reduce((total, ligne) => total + (ligne.montantHT || 0), 0);
|
||||
|
||||
const montantHT = facture.lignes.reduce((total, ligne) => total + (ligne.montantLigne || 0), 0);
|
||||
const montantTVA = montantHT * (facture.tauxTVA || 0) / 100;
|
||||
const montantTTC = montantHT + montantTVA;
|
||||
|
||||
|
||||
setFacture(prev => ({
|
||||
...prev,
|
||||
montantHT,
|
||||
@@ -185,7 +187,7 @@ const FactureEditPage = () => {
|
||||
quantite: 1,
|
||||
unite: 'unité',
|
||||
prixUnitaire: 0,
|
||||
montantHT: 0
|
||||
montantLigne: 0
|
||||
});
|
||||
setShowLigneDialog(true);
|
||||
};
|
||||
@@ -296,9 +298,9 @@ const FactureEditPage = () => {
|
||||
<label htmlFor="type" className="font-semibold">Type *</label>
|
||||
<Dropdown
|
||||
id="type"
|
||||
value={facture.type}
|
||||
value={facture.typeFacture}
|
||||
options={typeOptions}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, type: e.value }))}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, typeFacture: e.value }))}
|
||||
className="w-full"
|
||||
/>
|
||||
</div>
|
||||
@@ -362,8 +364,8 @@ const FactureEditPage = () => {
|
||||
<label htmlFor="dateEmission" className="font-semibold">Date d'émission *</label>
|
||||
<Calendar
|
||||
id="dateEmission"
|
||||
value={facture.dateEmission}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, dateEmission: e.value || new Date() }))}
|
||||
value={facture.dateEmission ? new Date(facture.dateEmission) : null}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, dateEmission: (e.value as Date)?.toISOString() || new Date().toISOString() }))}
|
||||
className="w-full"
|
||||
dateFormat="dd/mm/yy"
|
||||
/>
|
||||
@@ -375,8 +377,8 @@ const FactureEditPage = () => {
|
||||
<label htmlFor="dateEcheance" className="font-semibold">Date d'échéance *</label>
|
||||
<Calendar
|
||||
id="dateEcheance"
|
||||
value={facture.dateEcheance}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, dateEcheance: e.value || new Date() }))}
|
||||
value={facture.dateEcheance ? new Date(facture.dateEcheance) : null}
|
||||
onChange={(e) => setFacture(prev => ({ ...prev, dateEcheance: (e.value as Date)?.toISOString() || new Date().toISOString() }))}
|
||||
className="w-full"
|
||||
dateFormat="dd/mm/yy"
|
||||
/>
|
||||
@@ -575,7 +577,7 @@ const FactureEditPage = () => {
|
||||
<div className="field">
|
||||
<label className="font-semibold">Montant HT</label>
|
||||
<div className="text-xl font-bold text-primary">
|
||||
{formatCurrency(ligneForm.montantHT || 0)}
|
||||
{formatCurrency(ligneForm.montantLigne || 0)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -18,6 +18,7 @@ import { ProgressBar } from 'primereact/progressbar';
|
||||
import { factureService } from '../../../../services/api';
|
||||
import { formatDate, formatCurrency } from '../../../../utils/formatters';
|
||||
import type { Facture } from '../../../../types/btp';
|
||||
import { StatutFacture } from '../../../../types/btp';
|
||||
|
||||
const FactureDetailPage = () => {
|
||||
const params = useParams();
|
||||
@@ -39,7 +40,7 @@ const FactureDetailPage = () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const response = await factureService.getById(factureId);
|
||||
setFacture(response.data);
|
||||
setFacture(response);
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement de la facture:', error);
|
||||
setError('Impossible de charger la facture');
|
||||
@@ -130,7 +131,7 @@ const FactureDetailPage = () => {
|
||||
|
||||
const handleMarkAsPaid = async () => {
|
||||
try {
|
||||
await factureService.updateStatut(factureId, 'PAYEE');
|
||||
await factureService.update(factureId, { statut: StatutFacture.PAYEE });
|
||||
loadFacture();
|
||||
toast.current?.show({
|
||||
severity: 'success',
|
||||
@@ -275,13 +276,13 @@ const FactureDetailPage = () => {
|
||||
<h2 className="text-2xl font-bold mb-2">Facture #{facture.numero}</h2>
|
||||
<p className="text-600 mb-3">{facture.objet}</p>
|
||||
<div className="flex gap-2 mb-2">
|
||||
<Tag
|
||||
value={facture.statut}
|
||||
severity={getStatutSeverity(facture.statut)}
|
||||
<Tag
|
||||
value={facture.statut}
|
||||
severity={getStatutSeverity(facture.statut) as any}
|
||||
/>
|
||||
<Tag
|
||||
value={facture.type}
|
||||
severity={getTypeSeverity(facture.type)}
|
||||
<Tag
|
||||
value={facture.typeFacture}
|
||||
severity={getTypeSeverity(facture.typeFacture) as any}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -336,14 +337,14 @@ const FactureDetailPage = () => {
|
||||
<label className="font-semibold">Client:</label>
|
||||
<p>{typeof facture.client === 'string' ? facture.client : facture.client?.nom}</p>
|
||||
</div>
|
||||
{facture.devisId && (
|
||||
{facture.devis && (
|
||||
<div className="field">
|
||||
<label className="font-semibold">Devis source:</label>
|
||||
<p>
|
||||
<Button
|
||||
label={`Devis #${facture.devisId}`}
|
||||
label={`Devis #${typeof facture.devis === 'string' ? facture.devis : facture.devis?.numero}`}
|
||||
className="p-button-link p-0"
|
||||
onClick={() => router.push(`/devis/${facture.devisId}`)}
|
||||
onClick={() => router.push(`/devis/${typeof facture.devis === 'string' ? facture.devis : facture.devis?.id}`)}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -19,6 +19,7 @@ import { Divider } from 'primereact/divider';
|
||||
import { factureService, clientService } from '../../../../services/api';
|
||||
import { formatDate, formatCurrency } from '../../../../utils/formatters';
|
||||
import type { Facture } from '../../../../types/btp';
|
||||
import { StatutFacture, TypeFacture } from '../../../../types/btp';
|
||||
|
||||
const FacturesAvoirsPage = () => {
|
||||
const [avoirs, setAvoirs] = useState<Facture[]>([]);
|
||||
@@ -29,23 +30,24 @@ const FacturesAvoirsPage = () => {
|
||||
const [avoirDialog, setAvoirDialog] = useState(false);
|
||||
const [selectedAvoir, setSelectedAvoir] = useState<Facture | null>(null);
|
||||
const [isCreating, setIsCreating] = useState(false);
|
||||
const [avoir, setAvoir] = useState<Facture>({
|
||||
const [avoir, setAvoir] = useState<Partial<Facture>>({
|
||||
id: '',
|
||||
numero: '',
|
||||
dateEmission: new Date(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
|
||||
dateEmission: new Date().toISOString(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
|
||||
datePaiement: null,
|
||||
objet: '',
|
||||
description: '',
|
||||
montantHT: 0,
|
||||
montantTTC: 0,
|
||||
tauxTVA: 20,
|
||||
statut: 'EMISE',
|
||||
type: 'AVOIR',
|
||||
statut: StatutFacture.ENVOYEE,
|
||||
typeFacture: TypeFacture.AVOIR,
|
||||
actif: true,
|
||||
client: null,
|
||||
chantier: null,
|
||||
devis: null
|
||||
devis: null,
|
||||
lignes: []
|
||||
});
|
||||
const [submitted, setSubmitted] = useState(false);
|
||||
const toast = useRef<Toast>(null);
|
||||
@@ -70,7 +72,7 @@ const FacturesAvoirsPage = () => {
|
||||
setLoading(true);
|
||||
const data = await factureService.getAll();
|
||||
// Filtrer les avoirs
|
||||
const avoirsList = data.filter(facture => facture.type === 'AVOIR');
|
||||
const avoirsList = data.filter(facture => facture.typeFacture === TypeFacture.AVOIR);
|
||||
setAvoirs(avoirsList);
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement des avoirs:', error);
|
||||
@@ -133,20 +135,21 @@ const FacturesAvoirsPage = () => {
|
||||
setAvoir({
|
||||
id: '',
|
||||
numero: '',
|
||||
dateEmission: new Date(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
|
||||
dateEmission: new Date().toISOString(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
|
||||
datePaiement: null,
|
||||
objet: '',
|
||||
description: '',
|
||||
montantHT: 0,
|
||||
montantTTC: 0,
|
||||
tauxTVA: 20,
|
||||
statut: 'EMISE',
|
||||
type: 'AVOIR',
|
||||
statut: StatutFacture.ENVOYEE,
|
||||
typeFacture: TypeFacture.AVOIR,
|
||||
actif: true,
|
||||
client: null,
|
||||
chantier: null,
|
||||
devis: null
|
||||
devis: null,
|
||||
lignes: []
|
||||
});
|
||||
setSubmitted(false);
|
||||
setIsCreating(true);
|
||||
@@ -182,7 +185,7 @@ const FacturesAvoirsPage = () => {
|
||||
console.log('Création d\'avoir:', avoirToSave);
|
||||
|
||||
// Simulation
|
||||
setAvoirs(prev => [...prev, { ...avoirToSave, id: Date.now().toString() }]);
|
||||
setAvoirs(prev => [...prev, { ...avoirToSave, id: Date.now().toString() } as unknown as Facture]);
|
||||
|
||||
setAvoirDialog(false);
|
||||
|
||||
@@ -428,7 +431,7 @@ RECOMMANDATIONS:
|
||||
<Button
|
||||
icon="pi pi-send"
|
||||
rounded
|
||||
severity="secondary"
|
||||
severity={"secondary" as any}
|
||||
size="small"
|
||||
tooltip="Envoyer au client"
|
||||
onClick={() => {
|
||||
@@ -448,8 +451,8 @@ RECOMMANDATIONS:
|
||||
return (
|
||||
<div className="flex align-items-center gap-2">
|
||||
<Tag value="Avoir" severity="info" />
|
||||
<Tag
|
||||
value={rowData.statut === 'EMISE' ? 'Émis' : rowData.statut}
|
||||
<Tag
|
||||
value={rowData.statut === StatutFacture.ENVOYEE ? 'Émis' : rowData.statut}
|
||||
severity="success"
|
||||
/>
|
||||
</div>
|
||||
@@ -510,6 +513,7 @@ RECOMMANDATIONS:
|
||||
value={avoirs}
|
||||
selection={selectedAvoirs}
|
||||
onSelectionChange={(e) => setSelectedAvoirs(e.value)}
|
||||
selectionMode="multiple"
|
||||
dataKey="id"
|
||||
paginator
|
||||
rows={10}
|
||||
@@ -625,12 +629,12 @@ RECOMMANDATIONS:
|
||||
|
||||
<div className="field col-12">
|
||||
<label htmlFor="dateEmission">Date d'émission</label>
|
||||
<Calendar
|
||||
id="dateEmission"
|
||||
value={avoir.dateEmission}
|
||||
onChange={(e) => setAvoir(prev => ({ ...prev, dateEmission: e.value || new Date() }))}
|
||||
dateFormat="dd/mm/yy"
|
||||
showIcon
|
||||
<Calendar
|
||||
id="dateEmission"
|
||||
value={avoir.dateEmission ? new Date(avoir.dateEmission) : null}
|
||||
onChange={(e) => setAvoir(prev => ({ ...prev, dateEmission: (e.value as Date)?.toISOString() || new Date().toISOString() }))}
|
||||
dateFormat="dd/mm/yy"
|
||||
showIcon
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -680,7 +684,7 @@ RECOMMANDATIONS:
|
||||
<Button
|
||||
label="Envoyer"
|
||||
icon="pi pi-send"
|
||||
severity="secondary"
|
||||
severity={"secondary" as any}
|
||||
size="small"
|
||||
onClick={() => {
|
||||
toast.current?.show({
|
||||
@@ -702,4 +706,6 @@ RECOMMANDATIONS:
|
||||
);
|
||||
};
|
||||
|
||||
export default FacturesAvoirsPage;
|
||||
export default FacturesAvoirsPage;
|
||||
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import { Divider } from 'primereact/divider';
|
||||
import { factureService, clientService } from '../../../../services/api';
|
||||
import { formatDate, formatCurrency } from '../../../../utils/formatters';
|
||||
import type { Facture, Client } from '../../../../types/btp';
|
||||
import { StatutFacture, TypeFacture } from '../../../../types/btp';
|
||||
|
||||
interface ExportConfig {
|
||||
format: string;
|
||||
@@ -90,7 +91,7 @@ const FactureExportPage = () => {
|
||||
|
||||
// Charger les clients
|
||||
const clientsResponse = await clientService.getAll();
|
||||
setClients(clientsResponse.data);
|
||||
setClients(clientsResponse);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du chargement:', error);
|
||||
@@ -123,44 +124,44 @@ const FactureExportPage = () => {
|
||||
id: '1',
|
||||
numero: 'FAC-2024-001',
|
||||
objet: 'Rénovation salle de bain',
|
||||
type: 'FACTURE',
|
||||
statut: 'PAYEE',
|
||||
dateEmission: new Date('2024-01-15'),
|
||||
dateEcheance: new Date('2024-02-15'),
|
||||
typeFacture: TypeFacture.FACTURE,
|
||||
statut: StatutFacture.PAYEE,
|
||||
dateEmission: new Date('2024-01-15').toISOString(),
|
||||
dateEcheance: new Date('2024-02-15').toISOString(),
|
||||
client: { id: '1', nom: 'Dupont Construction' } as Client,
|
||||
montantHT: 2500,
|
||||
montantTTC: 3000,
|
||||
tauxTVA: 20,
|
||||
montantPaye: 3000
|
||||
},
|
||||
} as Facture,
|
||||
{
|
||||
id: '2',
|
||||
numero: 'FAC-2024-002',
|
||||
objet: 'Extension maison',
|
||||
type: 'ACOMPTE',
|
||||
statut: 'ENVOYEE',
|
||||
dateEmission: new Date('2024-02-01'),
|
||||
dateEcheance: new Date('2024-03-01'),
|
||||
typeFacture: TypeFacture.ACOMPTE,
|
||||
statut: StatutFacture.ENVOYEE,
|
||||
dateEmission: new Date('2024-02-01').toISOString(),
|
||||
dateEcheance: new Date('2024-03-01').toISOString(),
|
||||
client: { id: '2', nom: 'Martin SARL' } as Client,
|
||||
montantHT: 5000,
|
||||
montantTTC: 6000,
|
||||
tauxTVA: 20,
|
||||
montantPaye: 0
|
||||
},
|
||||
} as Facture,
|
||||
{
|
||||
id: '3',
|
||||
numero: 'FAC-2024-003',
|
||||
objet: 'Travaux électricité',
|
||||
type: 'FACTURE',
|
||||
statut: 'EN_RETARD',
|
||||
dateEmission: new Date('2024-01-20'),
|
||||
dateEcheance: new Date('2024-02-20'),
|
||||
typeFacture: TypeFacture.FACTURE,
|
||||
statut: StatutFacture.ECHUE,
|
||||
dateEmission: new Date('2024-01-20').toISOString(),
|
||||
dateEcheance: new Date('2024-02-20').toISOString(),
|
||||
client: { id: '3', nom: 'Bâti Plus' } as Client,
|
||||
montantHT: 1800,
|
||||
montantTTC: 2160,
|
||||
tauxTVA: 20,
|
||||
montantPaye: 0
|
||||
}
|
||||
} as Facture
|
||||
];
|
||||
|
||||
// Appliquer les filtres
|
||||
@@ -171,7 +172,7 @@ const FactureExportPage = () => {
|
||||
}
|
||||
|
||||
if (config.types.length > 0) {
|
||||
facturesFiltrees = facturesFiltrees.filter(f => config.types.includes(f.type));
|
||||
facturesFiltrees = facturesFiltrees.filter(f => config.types.includes(f.typeFacture));
|
||||
}
|
||||
|
||||
if (config.clients.length > 0) {
|
||||
@@ -504,9 +505,9 @@ const FactureExportPage = () => {
|
||||
field="statut"
|
||||
header="Statut"
|
||||
body={(rowData) => (
|
||||
<Tag
|
||||
value={rowData.statut}
|
||||
severity={getStatutSeverity(rowData.statut)}
|
||||
<Tag
|
||||
value={rowData.statut}
|
||||
severity={getStatutSeverity(rowData.statut) as any}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
|
||||
@@ -17,6 +17,7 @@ import { Chip } from 'primereact/chip';
|
||||
import { factureService } from '../../../../services/api';
|
||||
import { formatDate, formatCurrency } from '../../../../utils/formatters';
|
||||
import type { Facture } from '../../../../types/btp';
|
||||
import { StatutFacture } from '../../../../types/btp';
|
||||
import {
|
||||
ActionButtonGroup,
|
||||
ViewButton,
|
||||
@@ -70,8 +71,8 @@ const FacturesImpayeesPage = () => {
|
||||
setLoading(true);
|
||||
const data = await factureService.getAll();
|
||||
// Filtrer les factures impayées (émises ou envoyées mais pas payées)
|
||||
const facturesImpayees = data.filter(facture =>
|
||||
(facture.statut === 'EMISE' || facture.statut === 'ENVOYEE') &&
|
||||
const facturesImpayees = data.filter(facture =>
|
||||
(facture.statut === StatutFacture.ENVOYEE || facture.statut === StatutFacture.BROUILLON) &&
|
||||
!facture.datePaiement
|
||||
);
|
||||
setFactures(facturesImpayees);
|
||||
@@ -332,21 +333,21 @@ RECOMMANDATIONS:
|
||||
const actionBodyTemplate = (rowData: Facture) => {
|
||||
return (
|
||||
<ActionButtonGroup>
|
||||
<ActionButton
|
||||
icon="pi pi-check-circle"
|
||||
color="success"
|
||||
<ActionButton
|
||||
icon="pi pi-check-circle"
|
||||
color="green"
|
||||
tooltip="Enregistrer le paiement"
|
||||
onClick={() => recordPayment(rowData)}
|
||||
/>
|
||||
<ActionButton
|
||||
icon="pi pi-send"
|
||||
color="warning"
|
||||
<ActionButton
|
||||
icon="pi pi-send"
|
||||
color="orange"
|
||||
tooltip="Envoyer une relance"
|
||||
onClick={() => sendReminder(rowData)}
|
||||
/>
|
||||
<ActionButton
|
||||
icon="pi pi-calendar"
|
||||
color="info"
|
||||
<ActionButton
|
||||
icon="pi pi-calendar"
|
||||
color="blue"
|
||||
tooltip="Planifier un échéancier"
|
||||
onClick={() => schedulePayment(rowData)}
|
||||
/>
|
||||
@@ -489,6 +490,7 @@ RECOMMANDATIONS:
|
||||
value={factures}
|
||||
selection={selectedFactures}
|
||||
onSelectionChange={(e) => setSelectedFactures(e.value)}
|
||||
selectionMode="multiple"
|
||||
dataKey="id"
|
||||
paginator
|
||||
rows={10}
|
||||
@@ -640,4 +642,5 @@ RECOMMANDATIONS:
|
||||
);
|
||||
};
|
||||
|
||||
export default FacturesImpayeesPage;
|
||||
export default FacturesImpayeesPage;
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ import { RadioButton } from 'primereact/radiobutton';
|
||||
import { clientService, chantierService, devisService } from '../../../../services/api';
|
||||
import { formatCurrency } from '../../../../utils/formatters';
|
||||
import type { Facture, LigneFacture, Client, Chantier, Devis } from '../../../../types/btp';
|
||||
import { StatutFacture, TypeFacture } from '../../../../types/btp';
|
||||
|
||||
interface LigneFactureFormData {
|
||||
designation: string;
|
||||
@@ -42,22 +43,22 @@ const NouvelleFacturePage = () => {
|
||||
const [ligneDialog, setLigneDialog] = useState(false);
|
||||
const [creationMode, setCreationMode] = useState<'manual' | 'from_devis'>('manual');
|
||||
|
||||
const [facture, setFacture] = useState<Facture>({
|
||||
const [facture, setFacture] = useState<Partial<Facture>>({
|
||||
id: '',
|
||||
numero: '',
|
||||
objet: '',
|
||||
description: '',
|
||||
dateEmission: new Date(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // +30 jours
|
||||
dateEmission: new Date().toISOString(),
|
||||
dateEcheance: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // +30 jours
|
||||
datePaiement: null,
|
||||
statut: 'BROUILLON',
|
||||
statut: StatutFacture.BROUILLON,
|
||||
montantHT: 0,
|
||||
tauxTVA: 20,
|
||||
montantTVA: 0,
|
||||
montantTTC: 0,
|
||||
montantPaye: 0,
|
||||
conditionsPaiement: 'Paiement à 30 jours fin de mois',
|
||||
typeFacture: 'FACTURE',
|
||||
typeFacture: TypeFacture.FACTURE,
|
||||
actif: true,
|
||||
client: null,
|
||||
chantier: null,
|
||||
@@ -119,8 +120,9 @@ const NouvelleFacturePage = () => {
|
||||
|
||||
useEffect(() => {
|
||||
if (facture.client) {
|
||||
loadChantiersByClient(facture.client as string);
|
||||
loadDevisByClient(facture.client as string);
|
||||
const clientId = typeof facture.client === 'string' ? facture.client : facture.client.id;
|
||||
loadChantiersByClient(clientId);
|
||||
loadDevisByClient(clientId);
|
||||
} else {
|
||||
setChantiers([]);
|
||||
setDevisList([]);
|
||||
@@ -995,4 +997,5 @@ const NouvelleFacturePage = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default NouvelleFacturePage;
|
||||
export default NouvelleFacturePage;
|
||||
|
||||
|
||||
@@ -365,7 +365,7 @@ RECOMMANDATIONS:
|
||||
<Button
|
||||
icon="pi pi-file-pdf"
|
||||
rounded
|
||||
severity="secondary"
|
||||
severity={"secondary" as any}
|
||||
size="small"
|
||||
tooltip="Générer attestation de paiement"
|
||||
onClick={() => {
|
||||
@@ -585,7 +585,7 @@ RECOMMANDATIONS:
|
||||
<Button
|
||||
label="Attestation"
|
||||
icon="pi pi-file-pdf"
|
||||
severity="secondary"
|
||||
severity={"secondary" as any}
|
||||
size="small"
|
||||
onClick={() => {
|
||||
toast.current?.show({
|
||||
@@ -607,4 +607,6 @@ RECOMMANDATIONS:
|
||||
);
|
||||
};
|
||||
|
||||
export default FacturesPayeesPage;
|
||||
export default FacturesPayeesPage;
|
||||
|
||||
|
||||
|
||||
@@ -374,7 +374,7 @@ ACTIONS RECOMMANDÉES:
|
||||
<Button
|
||||
icon="pi pi-user-minus"
|
||||
rounded
|
||||
severity="secondary"
|
||||
severity={"secondary" as any}
|
||||
size="small"
|
||||
tooltip="Suspendre le client"
|
||||
onClick={() => suspendClient(rowData)}
|
||||
@@ -712,4 +712,6 @@ ACTIONS RECOMMANDÉES:
|
||||
);
|
||||
};
|
||||
|
||||
export default FacturesRetardPage;
|
||||
export default FacturesRetardPage;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user