fix/AS-prosec-revertir-boolean (#482)

prosec revertir boolean y uso de catalogo

Reviewed-on: ADUANASOFT/anexo76#482
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
This commit is contained in:
2026-06-02 21:06:23 +00:00
committed by acazares
parent 96b3beed4f
commit 26c5a97c04
7 changed files with 147 additions and 78 deletions

View File

@@ -97,7 +97,7 @@ export interface Company {
main_activity: string | null;
program: string | null;
program_number: string | null;
prosec: number | null;
prosec: boolean;
prosec_authorization: string | null;
manufacturer_id: string | null;
broker_company: string | null;
@@ -264,7 +264,7 @@ export interface CompanyCreate {
main_activity?: string | null;
program?: string | null;
program_number?: string | null;
prosec?: number | null;
prosec?: boolean;
prosec_authorization?: string | null;
manufacturer_id?: string | null;
broker_company?: string | null;

View File

@@ -4,9 +4,31 @@
import { Input } from "$lib/components/ui/input";
import { Label } from "$lib/components/ui/label";
import * as Tabs from "$lib/components/ui/tabs";
import { Switch } from "$lib/components/ui/switch";
import { Switch } from "$lib/components/ui/switch";
import { createCompany, updateCompany, type Company } from "$lib/api/dashboard/a76/general_catalogs/company";
import { sectorsApi } from "$lib/api/dashboard/reference_data/sectors";
import { companyStore } from "$lib/stores/company.svelte";
import SectorSelectorDialog from "$lib/components/dashboard/shared/modals/sector-selector-dialog.svelte";
import { Factory } from "lucide-svelte";
// Selector del sector PROSEC (se almacena por clave en prosec_authorization)
let sectorModalOpen = $state(false);
let prosecDisplay = $state('');
function handleSectorSelect(sector: { id: number; key: string; description: string }) {
formData.prosec_authorization = sector.key;
prosecDisplay = `${sector.key} - ${sector.description}`;
}
// Resuelve la descripción del sector a partir de su clave para mostrar "KEY - Descripción"
async function resolveProsecDisplay(key: string | null | undefined) {
const companyId = companyStore.activeCompany?.id;
if (!key || !companyId) return;
const sector = (await sectorsApi.getByKey(key, companyId)).data?.items?.find(
(s) => s.key === key
);
if (sector) prosecDisplay = `${sector.key} - ${sector.description}`;
}
let {
open = $bindable(false),
@@ -32,7 +54,7 @@
// Programas
program: '',
program_number: '',
prosec: 0,
prosec: false,
prosec_authorization: '',
// Responsable
@@ -66,7 +88,7 @@
program: item.program || '',
program_number: item.program_number || '',
prosec: item.prosec || 0,
prosec: Boolean(item.prosec),
prosec_authorization: item.prosec_authorization || '',
responsible_name: item.responsible_name || '',
@@ -82,11 +104,15 @@
ctpat_svi: item.ctpat_svi || '',
trusted_exporter_number: item.trusted_exporter_number || ''
};
// Mostrar el sector PROSEC almacenado por clave; enriquece con descripción async
prosecDisplay = item.prosec_authorization || '';
void resolveProsecDisplay(item.prosec_authorization);
} else {
// Reset manual si es nuevo
prosecDisplay = '';
// Reset manual si es nuevo
formData = {
name: '', rfc: '', curp: '', main_activity: '',
program: '', program_number: '', prosec: 0, prosec_authorization: '',
program: '', program_number: '', prosec: false, prosec_authorization: '',
responsible_name: '', responsible_last_name: '', responsible_mother_last_name: '', responsible_rfc: '', position: '',
manufacturer_id: '', is_service_company: false, order_format_type: '',
ctpat_svi: '', trusted_exporter_number: ''
@@ -113,7 +139,7 @@
program: formData.program.trim() || null,
program_number: formData.program_number.trim() || null,
prosec: formData.prosec || null,
prosec: Boolean(formData.prosec),
prosec_authorization: formData.prosec_authorization.trim() || null,
// Concatenar nombre completo del responsable si se desea guardar en 'responsible' también
@@ -210,13 +236,40 @@
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div class="grid gap-2">
<Label for="prosec">Sector PROSEC (ID)</Label>
<Input id="prosec" type="number" bind:value={formData.prosec} />
<div class="flex items-center gap-3 rounded-lg border p-4">
<Switch
id="prosec"
bind:checked={formData.prosec}
onCheckedChange={(checked) => {
if (!checked) {
formData.prosec_authorization = '';
prosecDisplay = '';
}
}}
/>
<Label for="prosec">PROSEC</Label>
</div>
<div class="grid gap-2">
<Label for="prosec_auth">Autorización PROSEC</Label>
<Input id="prosec_auth" bind:value={formData.prosec_authorization} />
<div class="flex gap-2">
<Input
id="prosec_auth"
value={prosecDisplay}
placeholder="Seleccionar sector..."
readonly
disabled={!formData.prosec}
/>
<Button
type="button"
variant="outline"
size="icon"
onclick={() => (sectorModalOpen = true)}
disabled={!formData.prosec}
title="Buscar Sector"
>
<Factory class="h-4 w-4" />
</Button>
</div>
</div>
</div>
</Tabs.Content>
@@ -290,4 +343,10 @@
</Dialog.Footer>
</form>
</Dialog.Content>
</Dialog.Root>
</Dialog.Root>
<SectorSelectorDialog
bind:open={sectorModalOpen}
onSelect={handleSectorSelect}
onClear={() => { formData.prosec_authorization = ''; prosecDisplay = ''; }}
/>

View File

@@ -92,7 +92,7 @@
main_activity: '',
program: '',
program_number: '',
prosec: 0,
prosec: false,
prosec_authorization: '',
responsible_name: '',
responsible_last_name: '',
@@ -267,7 +267,7 @@
main_activity: item.main_activity || '',
program: item.program || '',
program_number: item.program_number || '',
prosec: item.prosec || 0,
prosec: Boolean(item.prosec),
prosec_authorization: item.prosec_authorization || '',
responsible_name: item.responsible_name || '',
responsible_last_name: item.responsible_last_name || '',
@@ -413,17 +413,18 @@
cancel_key_exp: item.cancel_key_exp || 0
};
// Resolver el sector PROSEC contra el catálogo para mostrar KEY - Descripción
if (item.prosec) {
// Resolver el sector PROSEC (almacenado por clave en prosec_authorization)
// contra el catálogo para mostrar KEY - Descripción
if (item.prosec_authorization) {
const companyId = companyStore.activeCompany?.id;
if (companyId) {
const sectorResp = await sectorsApi.get(item.prosec, companyId);
prosecDisplay = sectorResp.data
? `${sectorResp.data.key} - ${sectorResp.data.description}`
: String(item.prosec); // fallback al ID si el sector no se encontró
} else {
prosecDisplay = String(item.prosec);
}
const sector = companyId
? (await sectorsApi.getByKey(item.prosec_authorization, companyId)).data?.items?.find(
(s) => s.key === item.prosec_authorization
)
: undefined;
prosecDisplay = sector
? `${sector.key} - ${sector.description}`
: item.prosec_authorization; // fallback a la clave si el sector no se encontró
} else {
prosecDisplay = '';
}
@@ -468,7 +469,8 @@
}
function handleSectorSelect(sector: { id: number; key: string; description: string }) {
formData.prosec = sector.id;
// El sector PROSEC se almacena por clave en prosec_authorization
formData.prosec_authorization = sector.key;
prosecDisplay = `${sector.key} - ${sector.description}`;
}
@@ -624,7 +626,7 @@
main_activity: clean(formData.main_activity),
program: clean(formData.program),
program_number: clean(formData.program_number),
prosec: Number(formData.prosec) || 0,
prosec: Boolean(formData.prosec),
prosec_authorization: clean(formData.prosec_authorization),
responsible_name: clean(formData.responsible_name),
responsible_last_name: clean(formData.responsible_last_name),
@@ -926,31 +928,41 @@
</div>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
<div class="flex items-center gap-3 rounded-lg border p-4">
<Switch
id="prosec"
bind:checked={formData.prosec}
onCheckedChange={(checked) => {
if (!checked) {
formData.prosec_authorization = '';
prosecDisplay = '';
}
}}
/>
<Label for="prosec">PROSEC</Label>
</div>
<div class="grid gap-2">
<Label for="prosec">Sector PROSEC</Label>
<Label for="prosec_auth">Autorización PROSEC</Label>
<div class="flex gap-2">
<Input
id="prosec"
id="prosec_auth"
value={prosecDisplay}
placeholder="Seleccionar sector..."
readonly
disabled={!formData.prosec}
/>
<Button
type="button"
variant="outline"
size="icon"
onclick={() => (sectorModalOpen = true)}
disabled={loading}
disabled={loading || !formData.prosec}
title="Buscar Sector"
>
<Factory class="h-4 w-4" />
</Button>
</div>
</div>
<div class="grid gap-2">
<Label for="prosec_auth">Autorización PROSEC</Label>
<Input id="prosec_auth" bind:value={formData.prosec_authorization} />
</div>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
<div class="grid gap-2">
@@ -2089,6 +2101,6 @@
<SectorSelectorDialog
bind:open={sectorModalOpen}
onSelect={handleSectorSelect}
onClear={() => { formData.prosec = 0; prosecDisplay = ''; }}
onClear={() => { formData.prosec_authorization = ''; prosecDisplay = ''; }}
/>
{/if}