Skip to main content

nfe_web/db/
models.rs

1//! Modelos para banco de dados
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6/// NF-e armazenada no banco de dados
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct NfeRecord {
9    pub id: String,
10    pub chave_acesso: String,
11    pub numero: i32,
12    pub serie: i16,
13    pub data_emissao: DateTime<Utc>,
14    pub emit_cnpj: String,
15    pub emit_razao_social: String,
16    pub dest_cnpj: Option<String>,
17    pub dest_razao_social: Option<String>,
18    pub valor_total: f64,
19    pub xml: String,
20    pub json_data: String,
21    pub created_at: DateTime<Utc>,
22}
23
24/// SQL para criar tabela no PostgreSQL
25pub const POSTGRES_CREATE_TABLE: &str = r#"
26CREATE TABLE IF NOT EXISTS nfe (
27    id VARCHAR(36) PRIMARY KEY,
28    chave_acesso VARCHAR(44) UNIQUE NOT NULL,
29    numero INTEGER NOT NULL,
30    serie SMALLINT NOT NULL,
31    data_emissao TIMESTAMP WITH TIME ZONE NOT NULL,
32    emit_cnpj VARCHAR(14) NOT NULL,
33    emit_razao_social VARCHAR(255) NOT NULL,
34    dest_cnpj VARCHAR(14),
35    dest_razao_social VARCHAR(255),
36    valor_total DECIMAL(15,2) NOT NULL,
37    xml TEXT NOT NULL,
38    json_data JSONB NOT NULL,
39    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
40);
41
42CREATE INDEX IF NOT EXISTS idx_nfe_chave ON nfe(chave_acesso);
43CREATE INDEX IF NOT EXISTS idx_nfe_emit_cnpj ON nfe(emit_cnpj);
44CREATE INDEX IF NOT EXISTS idx_nfe_data ON nfe(data_emissao);
45"#;
46
47/// SQL para criar tabela no MySQL
48pub const MYSQL_CREATE_TABLE: &str = r#"
49CREATE TABLE IF NOT EXISTS nfe (
50    id VARCHAR(36) PRIMARY KEY,
51    chave_acesso VARCHAR(44) UNIQUE NOT NULL,
52    numero INT NOT NULL,
53    serie SMALLINT NOT NULL,
54    data_emissao DATETIME NOT NULL,
55    emit_cnpj VARCHAR(14) NOT NULL,
56    emit_razao_social VARCHAR(255) NOT NULL,
57    dest_cnpj VARCHAR(14),
58    dest_razao_social VARCHAR(255),
59    valor_total DECIMAL(15,2) NOT NULL,
60    xml LONGTEXT NOT NULL,
61    json_data JSON NOT NULL,
62    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
63    INDEX idx_nfe_chave (chave_acesso),
64    INDEX idx_nfe_emit_cnpj (emit_cnpj),
65    INDEX idx_nfe_data (data_emissao)
66);
67"#;
68
69/// SQL para inserir NF-e (PostgreSQL)
70pub const POSTGRES_INSERT: &str = r#"
71INSERT INTO nfe (id, chave_acesso, numero, serie, data_emissao, emit_cnpj, emit_razao_social,
72                 dest_cnpj, dest_razao_social, valor_total, xml, json_data)
73VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
74ON CONFLICT (chave_acesso) DO UPDATE SET
75    xml = EXCLUDED.xml,
76    json_data = EXCLUDED.json_data
77"#;
78
79/// SQL para inserir NF-e (MySQL)
80pub const MYSQL_INSERT: &str = r#"
81INSERT INTO nfe (id, chave_acesso, numero, serie, data_emissao, emit_cnpj, emit_razao_social,
82                 dest_cnpj, dest_razao_social, valor_total, xml, json_data)
83VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
84ON DUPLICATE KEY UPDATE
85    xml = VALUES(xml),
86    json_data = VALUES(json_data)
87"#;
88
89/// SQL para buscar NF-e por chave (PostgreSQL/MySQL)
90pub const SELECT_BY_CHAVE: &str = "SELECT * FROM nfe WHERE chave_acesso = $1";
91
92/// SQL para listar NF-e (PostgreSQL/MySQL)
93pub const SELECT_ALL: &str = "SELECT * FROM nfe ORDER BY created_at DESC LIMIT $1 OFFSET $2";
94
95/// SQL para buscar por CNPJ emitente
96pub const SELECT_BY_EMIT_CNPJ: &str = "SELECT * FROM nfe WHERE emit_cnpj = $1 ORDER BY data_emissao DESC";