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`);