mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 10:43:18 +00:00
384 lines
13 KiB
SQL
384 lines
13 KiB
SQL
PRAGMA foreign_keys = ON;
|
|
PRAGMA journal_mode = WAL;
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
display_name TEXT NOT NULL,
|
|
company_id INTEGER REFERENCES companies(id),
|
|
tenant_id INTEGER,
|
|
role TEXT NOT NULL DEFAULT 'user',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS companies (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
code TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL,
|
|
parent_id INTEGER REFERENCES companies(id),
|
|
kind TEXT NOT NULL DEFAULT 'sub' CHECK (kind IN ('principal', 'sub')),
|
|
status TEXT NOT NULL DEFAULT 'activo' CHECK (status IN ('activo', 'inactivo')),
|
|
tenant_id INTEGER,
|
|
registro_patronal TEXT NOT NULL DEFAULT '',
|
|
razon_social TEXT NOT NULL DEFAULT '',
|
|
nombre_comercial TEXT NOT NULL DEFAULT '',
|
|
rfc TEXT NOT NULL DEFAULT '',
|
|
regimen_fiscal TEXT NOT NULL DEFAULT '',
|
|
clase_riesgo TEXT NOT NULL DEFAULT '',
|
|
domicilio_fiscal TEXT NOT NULL DEFAULT '',
|
|
codigo_postal TEXT NOT NULL DEFAULT '',
|
|
ciudad TEXT NOT NULL DEFAULT '',
|
|
estado TEXT NOT NULL DEFAULT '',
|
|
telefono TEXT NOT NULL DEFAULT '',
|
|
email TEXT NOT NULL DEFAULT '',
|
|
representante_legal TEXT NOT NULL DEFAULT '',
|
|
giro TEXT NOT NULL DEFAULT '',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS risk_levels (
|
|
code TEXT PRIMARY KEY,
|
|
label TEXT NOT NULL,
|
|
color TEXT NOT NULL,
|
|
text_color TEXT NOT NULL DEFAULT '#FFFFFF'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS badge_themes (
|
|
id TEXT PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
layout TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS projects (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
code TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL,
|
|
address TEXT NOT NULL DEFAULT '',
|
|
stage TEXT NOT NULL DEFAULT '',
|
|
status TEXT NOT NULL DEFAULT 'activo' CHECK (status IN ('activo', 'pausado', 'concluido', 'cancelado')),
|
|
theme_id TEXT NOT NULL REFERENCES badge_themes(id),
|
|
logo_left_path TEXT,
|
|
logo_right_path TEXT,
|
|
company_id INTEGER REFERENCES companies(id),
|
|
tenant_id INTEGER,
|
|
contract_amount REAL,
|
|
start_date TEXT,
|
|
end_date TEXT,
|
|
resident_name TEXT NOT NULL DEFAULT '',
|
|
siroc TEXT NOT NULL DEFAULT '',
|
|
payroll_tax_pct REAL NOT NULL DEFAULT 4,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS workers (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
first_name TEXT NOT NULL,
|
|
middle_name TEXT,
|
|
last_name_p TEXT NOT NULL,
|
|
last_name_m TEXT NOT NULL,
|
|
curp TEXT NOT NULL COLLATE NOCASE,
|
|
rfc TEXT NOT NULL COLLATE NOCASE,
|
|
nss TEXT NOT NULL,
|
|
phone TEXT NOT NULL,
|
|
email TEXT NOT NULL,
|
|
address TEXT NOT NULL,
|
|
blood_type TEXT,
|
|
hire_type TEXT NOT NULL,
|
|
company_id INTEGER REFERENCES companies(id),
|
|
tenant_id INTEGER,
|
|
position TEXT NOT NULL,
|
|
risk_code TEXT NOT NULL REFERENCES risk_levels(code),
|
|
work_type TEXT NOT NULL CHECK (work_type IN ('N', 'D')),
|
|
daily_wage REAL NOT NULL DEFAULT 0,
|
|
needs_badge INTEGER NOT NULL DEFAULT 1,
|
|
status TEXT NOT NULL DEFAULT 'activo' CHECK (status IN ('activo', 'baja')),
|
|
pipeline_status TEXT NOT NULL DEFAULT 'incompleto',
|
|
imss_status TEXT NOT NULL DEFAULT 'sin_alta' CHECK (imss_status IN ('sin_alta', 'alta', 'baja_imss')),
|
|
imss_company_id INTEGER REFERENCES companies(id),
|
|
imss_alta_at TEXT,
|
|
imss_baja_at TEXT,
|
|
last_rehire_at TEXT,
|
|
vcard_password_enc TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_workers_curp ON workers(curp);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_workers_rfc ON workers(rfc);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_workers_nss ON workers(nss);
|
|
|
|
CREATE TABLE IF NOT EXISTS assignments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id) ON DELETE CASCADE,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
active INTEGER NOT NULL DEFAULT 1,
|
|
start_date TEXT NOT NULL,
|
|
end_date TEXT,
|
|
UNIQUE (worker_id, project_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS document_types (
|
|
code TEXT PRIMARY KEY,
|
|
label TEXT NOT NULL,
|
|
required INTEGER NOT NULL DEFAULT 1,
|
|
validity_mode TEXT NOT NULL DEFAULT 'none' CHECK (validity_mode IN ('none', 'freshness', 'expiry')),
|
|
freshness_days INTEGER,
|
|
requires_issued_at INTEGER NOT NULL DEFAULT 0,
|
|
requires_expires_at INTEGER NOT NULL DEFAULT 0,
|
|
category TEXT NOT NULL DEFAULT 'identidad'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS documents (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id) ON DELETE CASCADE,
|
|
type_code TEXT NOT NULL REFERENCES document_types(code),
|
|
original_name TEXT NOT NULL,
|
|
mime TEXT NOT NULL,
|
|
size_bytes INTEGER NOT NULL,
|
|
sha256 TEXT NOT NULL,
|
|
iv TEXT NOT NULL,
|
|
storage_name TEXT NOT NULL,
|
|
is_current INTEGER NOT NULL DEFAULT 1,
|
|
parse_status TEXT NOT NULL DEFAULT 'manual',
|
|
issued_at TEXT,
|
|
expires_at TEXT,
|
|
imss_company_id INTEGER REFERENCES companies(id),
|
|
imss_alta_at TEXT,
|
|
uploaded_by INTEGER REFERENCES users(id),
|
|
uploaded_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS project_document_types (
|
|
code TEXT PRIMARY KEY,
|
|
label TEXT NOT NULL,
|
|
required INTEGER NOT NULL DEFAULT 1,
|
|
category TEXT NOT NULL DEFAULT 'contrato'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS project_documents (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
type_code TEXT NOT NULL REFERENCES project_document_types(code),
|
|
original_name TEXT NOT NULL,
|
|
mime TEXT NOT NULL,
|
|
size_bytes INTEGER NOT NULL,
|
|
sha256 TEXT NOT NULL,
|
|
iv TEXT NOT NULL,
|
|
storage_name TEXT NOT NULL,
|
|
is_current INTEGER NOT NULL DEFAULT 1,
|
|
parse_status TEXT NOT NULL DEFAULT 'manual',
|
|
uploaded_by INTEGER REFERENCES users(id),
|
|
uploaded_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS company_document_types (
|
|
code TEXT PRIMARY KEY,
|
|
label TEXT NOT NULL,
|
|
required INTEGER NOT NULL DEFAULT 0,
|
|
category TEXT NOT NULL DEFAULT 'otro'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS company_documents (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
company_id INTEGER NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
|
|
type_code TEXT NOT NULL REFERENCES company_document_types(code),
|
|
original_name TEXT NOT NULL,
|
|
mime TEXT NOT NULL,
|
|
size_bytes INTEGER NOT NULL,
|
|
sha256 TEXT NOT NULL,
|
|
iv TEXT NOT NULL,
|
|
storage_name TEXT NOT NULL,
|
|
is_current INTEGER NOT NULL DEFAULT 1,
|
|
parse_status TEXT NOT NULL DEFAULT 'manual',
|
|
uploaded_by INTEGER REFERENCES users(id),
|
|
uploaded_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS badge_jobs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id),
|
|
status TEXT NOT NULL DEFAULT 'done',
|
|
pdf_path TEXT,
|
|
created_by INTEGER REFERENCES users(id),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS badge_job_people (
|
|
job_id INTEGER NOT NULL REFERENCES badge_jobs(id) ON DELETE CASCADE,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id),
|
|
delivered INTEGER NOT NULL DEFAULT 0,
|
|
delivered_at TEXT,
|
|
PRIMARY KEY (job_id, worker_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS loans (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id) ON DELETE CASCADE,
|
|
amount REAL NOT NULL,
|
|
delivered REAL NOT NULL DEFAULT 0,
|
|
balance REAL NOT NULL,
|
|
weekly_payment REAL NOT NULL,
|
|
note TEXT,
|
|
commission_pct REAL NOT NULL DEFAULT 0,
|
|
commission_amount REAL NOT NULL DEFAULT 0,
|
|
plan TEXT NOT NULL DEFAULT 'single',
|
|
installments_n INTEGER NOT NULL DEFAULT 1,
|
|
first_due TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS attendance (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id) ON DELETE CASCADE,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
work_date TEXT NOT NULL,
|
|
present INTEGER NOT NULL DEFAULT 1,
|
|
UNIQUE (worker_id, project_id, work_date)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_periods (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id),
|
|
week_start TEXT NOT NULL,
|
|
week_end TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'draft',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_lines (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
period_id INTEGER NOT NULL REFERENCES payroll_periods(id) ON DELETE CASCADE,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id),
|
|
days REAL NOT NULL DEFAULT 0,
|
|
daily_wage REAL NOT NULL,
|
|
gross REAL NOT NULL,
|
|
discounts REAL NOT NULL DEFAULT 0,
|
|
loan_payment REAL NOT NULL DEFAULT 0,
|
|
net REAL NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_settings (
|
|
tenant_id INTEGER NOT NULL PRIMARY KEY,
|
|
loan_commission_enabled INTEGER NOT NULL DEFAULT 1,
|
|
loan_commission_pct REAL NOT NULL DEFAULT 10,
|
|
loan_small_max REAL NOT NULL DEFAULT 500
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_weeks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
week_start TEXT NOT NULL,
|
|
week_end TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'assembled', 'paid')),
|
|
required_net REAL NOT NULL DEFAULT 0,
|
|
payable_net REAL NOT NULL DEFAULT 0,
|
|
assembled_at TEXT,
|
|
paid_at TEXT,
|
|
tenant_id INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_sheets (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
week_id INTEGER NOT NULL REFERENCES payroll_weeks(id) ON DELETE CASCADE,
|
|
kind TEXT NOT NULL CHECK (kind IN ('obra', 'destajo', 'admin')),
|
|
project_id INTEGER REFERENCES projects(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS payroll_week_lines (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
sheet_id INTEGER NOT NULL REFERENCES payroll_sheets(id) ON DELETE CASCADE,
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id),
|
|
destajo_cut_line_id INTEGER,
|
|
project_id INTEGER REFERENCES projects(id),
|
|
days REAL NOT NULL DEFAULT 0,
|
|
daily_wage REAL NOT NULL DEFAULT 0,
|
|
qty_planned REAL NOT NULL DEFAULT 0,
|
|
qty_actual REAL NOT NULL DEFAULT 0,
|
|
qty_extra REAL NOT NULL DEFAULT 0,
|
|
unit_price REAL NOT NULL DEFAULT 0,
|
|
unit_code TEXT,
|
|
concepto TEXT,
|
|
amount REAL NOT NULL DEFAULT 0,
|
|
gross REAL NOT NULL DEFAULT 0,
|
|
discounts REAL NOT NULL DEFAULT 0,
|
|
loan_id INTEGER REFERENCES loans(id),
|
|
loan_discount REAL NOT NULL DEFAULT 0,
|
|
loan_label TEXT,
|
|
required_net REAL NOT NULL DEFAULT 0,
|
|
payable_net REAL NOT NULL DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS destajo_units (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
tenant_id INTEGER NOT NULL DEFAULT 0,
|
|
code TEXT NOT NULL,
|
|
label TEXT NOT NULL,
|
|
UNIQUE (tenant_id, code)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS destajo_periods (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
period_start TEXT NOT NULL,
|
|
period_end TEXT NOT NULL,
|
|
week_id INTEGER NOT NULL REFERENCES payroll_weeks(id) ON DELETE CASCADE,
|
|
tenant_id INTEGER NOT NULL DEFAULT 0,
|
|
UNIQUE (tenant_id, period_end)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS destajo_jobs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id),
|
|
worker_id INTEGER NOT NULL REFERENCES workers(id),
|
|
concepto TEXT NOT NULL,
|
|
unit_code TEXT NOT NULL,
|
|
qty_total_estimated REAL NOT NULL,
|
|
unit_price REAL NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'done')),
|
|
tenant_id INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS destajo_cut_lines (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
period_id INTEGER NOT NULL REFERENCES destajo_periods(id) ON DELETE CASCADE,
|
|
job_id INTEGER NOT NULL REFERENCES destajo_jobs(id) ON DELETE CASCADE,
|
|
qty_planned REAL NOT NULL DEFAULT 0,
|
|
qty_actual REAL NOT NULL DEFAULT 0,
|
|
qty_extra REAL NOT NULL DEFAULT 0,
|
|
UNIQUE (period_id, job_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS loan_payments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
loan_id INTEGER NOT NULL REFERENCES loans(id) ON DELETE CASCADE,
|
|
week_id INTEGER NOT NULL REFERENCES payroll_weeks(id),
|
|
amount REAL NOT NULL,
|
|
installment_n INTEGER NOT NULL DEFAULT 1,
|
|
label TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS budget_chapters (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
parent_id INTEGER REFERENCES budget_chapters(id) ON DELETE SET NULL,
|
|
code TEXT NOT NULL DEFAULT '',
|
|
name TEXT NOT NULL,
|
|
wbs TEXT NOT NULL DEFAULT '',
|
|
sort_order INTEGER NOT NULL DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS budget_items (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
chapter_id INTEGER REFERENCES budget_chapters(id) ON DELETE SET NULL,
|
|
code TEXT NOT NULL DEFAULT '',
|
|
description TEXT NOT NULL,
|
|
unit TEXT NOT NULL DEFAULT '',
|
|
quantity REAL NOT NULL DEFAULT 0,
|
|
unit_price REAL NOT NULL DEFAULT 0,
|
|
amount REAL NOT NULL DEFAULT 0,
|
|
wbs TEXT NOT NULL DEFAULT '',
|
|
sort_order INTEGER NOT NULL DEFAULT 0
|
|
);
|