Checkpoint: Correctifs validés en sandbox : retour contextuel depuis le détail vers Factures BAP avec filtres et tri conservés, et nouvelle action Abonnement Oui/Non/Ne pas modifier dans les automatismes. Ajout de tests de non-régression.
This commit is contained in:
@@ -46,6 +46,7 @@ interface Actions {
|
||||
typeAchat?: string;
|
||||
serviceConcerne?: string;
|
||||
ventilationComptable?: string;
|
||||
isSubscription?: 0 | 1;
|
||||
}
|
||||
|
||||
export default function AutomationRules() {
|
||||
@@ -84,6 +85,12 @@ export default function AutomationRules() {
|
||||
return val;
|
||||
};
|
||||
|
||||
const normalizeSubscriptionAction = (value: unknown): 0 | 1 | undefined => {
|
||||
if (value === 1 || value === "1" || value === "OUI") return 1;
|
||||
if (value === 0 || value === "0" || value === "NON") return 0;
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const createMutation = trpc.automationRules.create.useMutation({
|
||||
onSuccess: (rule) => {
|
||||
if (rule.isActive === 1) {
|
||||
@@ -204,7 +211,7 @@ export default function AutomationRules() {
|
||||
} else {
|
||||
setCustomVentilation("");
|
||||
}
|
||||
setActions(parsedActions);
|
||||
setActions({ ...parsedActions, isSubscription: normalizeSubscriptionAction(parsedActions.isSubscription) });
|
||||
} catch {
|
||||
setActions({});
|
||||
setCustomTypeAchat("");
|
||||
@@ -231,11 +238,13 @@ export default function AutomationRules() {
|
||||
typeAchat: resolveAction(actions.typeAchat, customTypeAchat),
|
||||
serviceConcerne: resolveAction(actions.serviceConcerne, customServiceConcerne),
|
||||
ventilationComptable: resolveAction(actions.ventilationComptable, customVentilation),
|
||||
isSubscription: actions.isSubscription,
|
||||
};
|
||||
// Supprimer les clés undefined
|
||||
if (!resolvedActions.typeAchat) delete resolvedActions.typeAchat;
|
||||
if (!resolvedActions.serviceConcerne) delete resolvedActions.serviceConcerne;
|
||||
if (!resolvedActions.ventilationComptable) delete resolvedActions.ventilationComptable;
|
||||
if (resolvedActions.isSubscription === undefined) delete resolvedActions.isSubscription;
|
||||
const actionsJSON = JSON.stringify(resolvedActions);
|
||||
|
||||
if (editingRule) {
|
||||
@@ -372,6 +381,7 @@ export default function AutomationRules() {
|
||||
if (acts.typeAchat) actionsArr.push(`Type: ${acts.typeAchat}`);
|
||||
if (acts.serviceConcerne) actionsArr.push(`Service: ${acts.serviceConcerne}`);
|
||||
if (acts.ventilationComptable) actionsArr.push(`Ventilation: ${acts.ventilationComptable}`);
|
||||
if (acts.isSubscription !== undefined) actionsArr.push(`Abonnement: ${normalizeSubscriptionAction(acts.isSubscription) === 1 ? "Oui" : "Non"}`);
|
||||
actionsDisplay = actionsArr.join(", ");
|
||||
} catch {}
|
||||
|
||||
@@ -610,6 +620,23 @@ export default function AutomationRules() {
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="isSubscription">Abonnement</Label>
|
||||
<Select
|
||||
value={actions.isSubscription === undefined ? "__NONE__" : String(actions.isSubscription)}
|
||||
onValueChange={(value) => setActions({ ...actions, isSubscription: value === "__NONE__" ? undefined : Number(value) as 0 | 1 })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Ne pas modifier" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="__NONE__">Ne pas modifier</SelectItem>
|
||||
<SelectItem value="1">Oui</SelectItem>
|
||||
<SelectItem value="0">Non</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -642,7 +669,8 @@ export default function AutomationRules() {
|
||||
{actions.typeAchat && <div>• Type d'achat : {actions.typeAchat}</div>}
|
||||
{actions.serviceConcerne && <div>• Service : {actions.serviceConcerne}</div>}
|
||||
{actions.ventilationComptable && <div>• Ventilation : {actions.ventilationComptable}</div>}
|
||||
{!actions.typeAchat && !actions.serviceConcerne && !actions.ventilationComptable && (
|
||||
{actions.isSubscription !== undefined && <div>• Abonnement : {actions.isSubscription === 1 ? "Oui" : "Non"}</div>}
|
||||
{!actions.typeAchat && !actions.serviceConcerne && !actions.ventilationComptable && actions.isSubscription === undefined && (
|
||||
<div className="text-gray-500 italic">Aucune action définie</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -829,6 +857,23 @@ export default function AutomationRules() {
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="isSubscription">Abonnement</Label>
|
||||
<Select
|
||||
value={actions.isSubscription === undefined ? "__NONE__" : String(actions.isSubscription)}
|
||||
onValueChange={(value) => setActions({ ...actions, isSubscription: value === "__NONE__" ? undefined : Number(value) as 0 | 1 })}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Ne pas modifier" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value="__NONE__">Ne pas modifier</SelectItem>
|
||||
<SelectItem value="1">Oui</SelectItem>
|
||||
<SelectItem value="0">Non</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user