179 lines
6.7 KiB
TypeScript
179 lines
6.7 KiB
TypeScript
import { sql } from 'drizzle-orm';
|
|
import * as t from 'drizzle-orm/pg-core';
|
|
import { timestamps } from '../timestamps';
|
|
import { users } from './auth';
|
|
import { municipalities, parishes, states } from './general';
|
|
|
|
// Tabla surveys
|
|
export const surveys = t.pgTable(
|
|
'surveys',
|
|
{
|
|
id: t.serial('id').primaryKey(),
|
|
title: t.text('title').notNull(),
|
|
description: t.text('description').notNull(),
|
|
targetAudience: t.varchar('target_audience', { length: 50 }).notNull(),
|
|
closingDate: t.date('closing_date'),
|
|
published: t.boolean('published').notNull(),
|
|
questions: t.jsonb('questions').notNull(),
|
|
...timestamps,
|
|
},
|
|
(surveys) => ({
|
|
surveysIndex: t.index('surveys_index_00').on(surveys.title),
|
|
}),
|
|
);
|
|
|
|
export const answersSurveys = t.pgTable(
|
|
'answers_surveys',
|
|
{
|
|
id: t.serial('id').primaryKey(),
|
|
surveyId: t
|
|
.integer('survey_id')
|
|
.references(() => surveys.id, { onDelete: 'cascade' }),
|
|
userId: t
|
|
.integer('user_id')
|
|
.references(() => users.id, { onDelete: 'cascade' }),
|
|
answers: t.jsonb('answers').notNull(),
|
|
...timestamps,
|
|
},
|
|
(answers) => ({
|
|
answersIndex: t.index('answers_index_00').on(answers.answers),
|
|
answersIndex01: t.index('answers_index_01').on(answers.surveyId),
|
|
answersIndex02: t.index('answers_index_02').on(answers.userId),
|
|
}),
|
|
);
|
|
|
|
// Tabla training_surveys
|
|
export const trainingSurveys = t.pgTable(
|
|
'training_surveys',
|
|
{
|
|
// === 1. IDENTIFICADORES Y DATOS DE VISITA ===
|
|
id: t.serial('id').primaryKey(),
|
|
coorFullName: t.text('coor_full_name').notNull(),
|
|
visitDate: t.timestamp('visit_date').notNull(),
|
|
coorPhone: t.text('coor_phone'),
|
|
|
|
// === 2. UBICACIÓN (Claves Foráneas - Nullables) ===
|
|
state: t
|
|
.integer('state')
|
|
.references(() => states.id, { onDelete: 'set null' }),
|
|
municipality: t
|
|
.integer('municipality')
|
|
.references(() => municipalities.id, { onDelete: 'set null' }),
|
|
parish: t
|
|
.integer('parish')
|
|
.references(() => parishes.id, { onDelete: 'set null' }),
|
|
|
|
// === 3. DATOS DE LA OSP (Organización Socioproductiva) ===
|
|
ospType: t.text('osp_type').notNull(), // UPF, EPS, etc.
|
|
ecoSector: t.text('eco_sector').notNull().default(''),
|
|
productiveSector: t.text('productive_sector').notNull().default(''),
|
|
centralProductiveActivity: t
|
|
.text('central_productive_activity')
|
|
.notNull()
|
|
.default(''),
|
|
mainProductiveActivity: t
|
|
.text('main_productive_activity')
|
|
.notNull()
|
|
.default(''),
|
|
productiveActivity: t.text('productive_activity').notNull(),
|
|
ospRif: t.text('osp_rif'),
|
|
ospName: t.text('osp_name'),
|
|
companyConstitutionYear: t.integer('company_constitution_year').notNull(),
|
|
currentStatus: t.text('current_status').notNull().default('ACTIVA'),
|
|
infrastructureMt2: t.text('infrastructure_mt2').notNull().default(''),
|
|
hasTransport: t.boolean('has_transport').notNull().default(false),
|
|
structureType: t.text('structure_type').notNull().default(''),
|
|
isOpenSpace: t.boolean('is_open_space').notNull().default(false),
|
|
paralysisReason: t.text('paralysis_reason'),
|
|
equipmentList: t.jsonb('equipment_list').notNull().default([]),
|
|
productionList: t.jsonb('production_list').notNull().default([]),
|
|
productList: t.jsonb('product_list').notNull().default([]),
|
|
ospAddress: t.text('osp_address').notNull(),
|
|
ospGoogleMapsLink: t.text('osp_google_maps_link').notNull().default(''),
|
|
communeName: t.text('commune_name').notNull().default(''),
|
|
siturCodeCommune: t.text('situr_code_commune').notNull(),
|
|
communeRif: t.text('commune_rif').notNull().default(''),
|
|
communeSpokespersonName: t
|
|
.text('commune_spokesperson_name')
|
|
.notNull()
|
|
.default(''),
|
|
communeSpokespersonCedula: t.text('commune_spokesperson_cedula'),
|
|
communeSpokespersonRif: t.text('commune_spokesperson_rif'),
|
|
communeSpokespersonPhone: t
|
|
.text('commune_spokesperson_phone')
|
|
.notNull()
|
|
.default(''),
|
|
communeEmail: t.text('commune_email'),
|
|
communalCouncil: t.text('communal_council').notNull(),
|
|
siturCodeCommunalCouncil: t.text('situr_code_communal_council').notNull(),
|
|
communalCouncilRif: t.text('communal_council_rif').notNull().default(''),
|
|
communalCouncilSpokespersonName: t
|
|
.text('communal_council_spokesperson_name')
|
|
.notNull()
|
|
.default(''),
|
|
communalCouncilSpokespersonCedula: t.text(
|
|
'communal_council_spokesperson_cedula',
|
|
),
|
|
communalCouncilSpokespersonRif: t.text('communal_council_spokesperson_rif'),
|
|
communalCouncilSpokespersonPhone: t
|
|
.text('communal_council_spokesperson_phone')
|
|
.notNull()
|
|
.default(''),
|
|
communalCouncilEmail: t
|
|
.text('communal_council_email')
|
|
.notNull()
|
|
.default(''),
|
|
ospResponsibleFullname: t.text('osp_responsible_fullname').notNull(),
|
|
ospResponsibleCedula: t.text('osp_responsible_cedula').notNull(),
|
|
ospResponsibleRif: t.text('osp_responsible_rif'),
|
|
civilState: t.text('civil_state'),
|
|
ospResponsiblePhone: t.text('osp_responsible_phone').notNull(),
|
|
ospResponsibleEmail: t.text('osp_responsible_email'),
|
|
familyBurden: t.integer('family_burden'),
|
|
numberOfChildren: t.integer('number_of_children'),
|
|
generalObservations: t.text('general_observations'),
|
|
|
|
// === 4. DATOS DE DISTRIBUCIÓN Y EXPORTACIÓN ===
|
|
internalDistributionZone: t.text('internal_distribution_zone'),
|
|
isExporting: t.boolean('is_exporting').notNull().default(false),
|
|
externalCountry: t.text('external_country'),
|
|
externalCity: t.text('external_city'),
|
|
externalDescription: t.text('external_description'),
|
|
externalQuantity: t.text('external_quantity'),
|
|
externalUnit: t.text('external_unit'),
|
|
|
|
// === 5. MANO DE OBRA ===
|
|
womenCount: t.integer('women_count').notNull().default(0),
|
|
menCount: t.integer('men_count').notNull().default(0),
|
|
|
|
// Fotos
|
|
photo1: t.text('photo1'),
|
|
photo2: t.text('photo2'),
|
|
photo3: t.text('photo3'),
|
|
// informacion del usuario que creo y actualizo el registro
|
|
createdBy: t
|
|
.integer('created_by')
|
|
.references(() => users.id, { onDelete: 'cascade' }),
|
|
updatedBy: t
|
|
.integer('updated_by')
|
|
.references(() => users.id, { onDelete: 'cascade' }),
|
|
...timestamps,
|
|
},
|
|
(trainingSurveys) => ({
|
|
trainingSurveysIndex: t
|
|
.index('training_surveys_index_00')
|
|
.on(trainingSurveys.coorFullName),
|
|
}),
|
|
);
|
|
|
|
export const viewSurveys = t.pgView('v_surveys', {
|
|
surverId: t.integer('survey_id'),
|
|
title: t.text('title'),
|
|
description: t.text('description'),
|
|
created_at: t.timestamp('created_at'),
|
|
closingDate: t.date('closing_date'),
|
|
targetAudience: t.varchar('target_audience'),
|
|
})
|
|
.as(sql`select id as survey_id, title, description, created_at, closing_date, target_audience from surveys
|
|
where published = true`);
|