-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommands.sql
2397 lines (2036 loc) · 84.2 KB
/
commands.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-------------------------------------------------------------------------------------------------------------------
-- =========================================================================================================== --
-- ================================== Tablas, secuencias y constrains ======================================== --
-- =========================================================================================================== --
-------------------------------------------------------------------------------------------------------------------
-- create sequence for PAIS
CREATE SEQUENCE pais_seq START WITH 1 INCREMENT BY 1 MAXVALUE 193;
-- create pais
CREATE TABLE PAIS (
paisId NUMERIC(3) PRIMARY KEY DEFAULT nextval('pais_seq'),
nombrePais TEXT NOT NULL,
continente TEXT NOT NULL
);
-- add check constraint to continente
ALTER TABLE PAIS
ADD CONSTRAINT chk_continente
CHECK (continente IN ('Af', 'As', 'Am', 'Eu', 'Oc'));
-------------------------------------------------------------------------------------------------------------------
-- create sequence for SUBASTADORA
CREATE SEQUENCE subastadora_seq START WITH 1 INCREMENT BY 1;
-- create subastadora
CREATE TABLE SUBASTADORA (
subastadoraId NUMERIC PRIMARY KEY DEFAULT nextval('subastadora_seq'),
nombreSubastadora TEXT NOT NULL,
idPais NUMERIC NOT NULL
);
-- add foreign key constraint
ALTER TABLE SUBASTADORA
ADD CONSTRAINT fk_idPais_subastadora
FOREIGN KEY (idPais)
REFERENCES PAIS(paisId);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for PRODUCTORAS
CREATE SEQUENCE productoras_seq START WITH 1 INCREMENT BY 1;
-- create productoras
CREATE TABLE PRODUCTORAS (
productoraId NUMERIC PRIMARY KEY DEFAULT nextval('productoras_seq'),
nombreProductora VARCHAR NOT NULL,
paginaWeb VARCHAR NOT NULL,
idPais NUMERIC NOT NULL
);
-- add foreign key constraint
ALTER TABLE PRODUCTORAS
ADD CONSTRAINT fk_idPais_productoras
FOREIGN KEY (idPais)
REFERENCES PAIS(paisId);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for FLORISTERIAS
CREATE SEQUENCE floristerias_seq START WITH 1 INCREMENT BY 1;
-- create floristerias
CREATE TABLE FLORISTERIAS (
floristeriaId NUMERIC PRIMARY KEY DEFAULT nextval('floristerias_seq'),
nombre VARCHAR NOT NULL,
email VARCHAR NOT NULL,
paginaWeb VARCHAR NOT NULL,
idPais NUMERIC NOT NULL
);
-- add foreign key constraint
ALTER TABLE FLORISTERIAS
ADD CONSTRAINT fk_idPais_floristerias
FOREIGN KEY (idPais)
REFERENCES PAIS(paisId);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for CLIENTE_NATURAL
CREATE SEQUENCE cliente_natural_seq START WITH 1 INCREMENT BY 1;
-- create CLIENTE_NATURAL
CREATE TABLE CLIENTE_NATURAL (
cliNaturalId NUMERIC PRIMARY KEY DEFAULT nextval('cliente_natural_seq'),
documentoIdentidad NUMERIC NOT NULL,
primernombre VARCHAR NOT NULL,
primerApellido VARCHAR NOT NULL,
segundoApellido VARCHAR NOT NULL,
segundonombre VARCHAR
);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for CLIENTE_JURIDICO
CREATE SEQUENCE cliente_juridico_seq START WITH 1 INCREMENT BY 1;
-- create CLIENTE_JURIDICO
CREATE TABLE CLIENTE_JURIDICO (
cliJuridicoId NUMERIC PRIMARY KEY DEFAULT nextval('cliente_juridico_seq'),
RIF NUMERIC NOT NULL UNIQUE,
nombre VARCHAR NOT NULL
);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for FLOR_CORTES
CREATE SEQUENCE flor_cortes_seq START WITH 1 INCREMENT BY 1;
-- create FLOR_CORTES
CREATE TABLE FLOR_CORTES (
corteId NUMERIC PRIMARY KEY DEFAULT nextval('flor_cortes_seq'),
nombreComun VARCHAR NOT NULL,
Descripcion VARCHAR NOT NULL,
genero_especie VARCHAR NOT NULL,
etimologia VARCHAR NOT NULL,
colores VARCHAR NOT NULL,
temperatura NUMERIC NOT NULL
);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for SIGNIFICADO
CREATE SEQUENCE significado_seq START WITH 1 INCREMENT BY 1;
-- create SIGNIFICADO
CREATE TABLE SIGNIFICADO (
SignificadoId NUMERIC PRIMARY KEY DEFAULT nextval('significado_seq'),
Tipo VARCHAR NOT NULL,
Descripcion VARCHAR NOT NULL
);
-- Agregar restricción CHECK a la columna Tipo en la tabla SIGNIFICADO
ALTER TABLE SIGNIFICADO
ADD CONSTRAINT chk_tipo CHECK (Tipo IN ('Oc', 'Se'));
-------------------------------------------------------------------------------------------------------------------
-- create sequence for COLOR
CREATE SEQUENCE color_seq START WITH 1 INCREMENT BY 1;
-- create COLOR
CREATE TABLE COLOR (
colorId NUMERIC PRIMARY KEY DEFAULT nextval('color_seq'),
Nombre VARCHAR NOT NULL,
Descripcion VARCHAR NOT NULL
);
-------------------------------------------------------------------------------------------------------------------
-- create sequence for ENLACES
CREATE SEQUENCE enlaces_seq START WITH 1 INCREMENT BY 1;
-- create ENLACES
CREATE TABLE ENLACES (
IdSignificado NUMERIC NOT NULL,
enlaceId NUMERIC NOT NULL DEFAULT nextval('enlaces_seq'),
Descripcion VARCHAR NOT NULL,
idColor NUMERIC,
idCorte NUMERIC,
PRIMARY KEY (IdSignificado, enlaceId)
);
-- Agregar clave foránea
ALTER TABLE ENLACES
ADD CONSTRAINT fk_IdSignificado FOREIGN KEY (IdSignificado) REFERENCES SIGNIFICADO(SignificadoId);
ALTER TABLE ENLACES
ADD CONSTRAINT FK_Enlaces_Color FOREIGN KEY (idColor) REFERENCES COLOR(colorId);
ALTER TABLE ENLACES
ADD CONSTRAINT FK_Enlaces_Corte FOREIGN KEY (idCorte) REFERENCES FLOR_CORTES(corteId);
ALTER TABLE ENLACES
ADD CONSTRAINT chk_enlaces CHECK (idColor IS NOT NULL OR idCorte IS NOT NULL);
--------------------------------------------------------------------------------------------------------------------
-- create CATALOGOPRODUCTOR
CREATE TABLE CATALOGOPRODUCTOR (
idProductora NUMERIC NOT NULL,
idCorte NUMERIC NOT NULL,
vbn NUMERIC NOT NULL,
nombrepropio VARCHAR NOT NULL,
descripcion VARCHAR,
PRIMARY KEY (idProductora, idCorte, vbn)
);
-- Agregar claves foráneas y restricción UNIQUE
ALTER TABLE CATALOGOPRODUCTOR
ADD CONSTRAINT FK_Catalogo_Corte FOREIGN KEY (idCorte) REFERENCES FLOR_CORTES(corteId);
ALTER TABLE CATALOGOPRODUCTOR
ADD CONSTRAINT FK_Catalogo_Productora FOREIGN KEY (idProductora) REFERENCES PRODUCTORAS(productoraId);
ALTER TABLE CATALOGOPRODUCTOR
ADD CONSTRAINT unique_vbn UNIQUE (vbn);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE CONTRATO (
idSubastadora NUMERIC NOT NULL,
idProductora NUMERIC NOT NULL,
nContrato NUMERIC NOT NULL,
fechaemision DATE NOT NULL,
porcentajeProduccion NUMERIC(3,2) NOT NULL,
tipoProductor VARCHAR NOT NULL,
idrenovS NUMERIC,
idrenovP NUMERIC,
ren_nContrato NUMERIC,
cancelado DATE,
PRIMARY KEY (idSubastadora, idProductora, nContrato)
);
-- Agregar claves foráneas y check
ALTER TABLE CONTRATO
ADD CONSTRAINT fk_idSubastadora_contrato FOREIGN KEY (idSubastadora) REFERENCES SUBASTADORA (subastadoraId);
ALTER TABLE CONTRATO
ADD CONSTRAINT fk_idProductora_contrato FOREIGN KEY (idProductora) REFERENCES PRODUCTORAS (productoraId);
ALTER TABLE CONTRATO
ADD CONSTRAINT fk_renovacion_contrato FOREIGN KEY (idrenovS, idrenovP, ren_nContrato) REFERENCES CONTRATO(idSubastadora, idProductora, nContrato);
ALTER TABLE CONTRATO
ADD CONSTRAINT check_tipoProductor CHECK (tipoProductor IN ('Ca', 'Cb', 'Cc', 'Cg', 'Ka'));
ALTER TABLE CONTRATO
ADD CONSTRAINT check_porcentajeProduccion CHECK (
(tipoProductor = 'Ca' AND porcentajeProduccion > 0.50) OR
(tipoProductor = 'Cb' AND porcentajeProduccion > 0.20 AND porcentajeProduccion < 0.50) OR
(tipoProductor = 'Cc' AND porcentajeProduccion < 0.20) OR
(tipoProductor = 'Ka' AND porcentajeProduccion = 1.00)
);
-----------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE CANTIDAD_OFRECIDA (
idContratoSubastadora NUMERIC NOT NULL,
idContratoProductora NUMERIC NOT NULL,
idNContrato NUMERIC NOT NULL,
idCatalogoProductora NUMERIC NOT NULL,
idCatalogoCorte NUMERIC NOT NULL,
idVnb NUMERIC NOT NULL,
cantidad NUMERIC NOT NULL,
PRIMARY KEY (idContratoSubastadora, idContratoProductora, idNContrato, idCatalogoProductora, idCatalogoCorte, idVnb)
);
-- Agregar claves foráneas compuestas
ALTER TABLE CANTIDAD_OFRECIDA
ADD CONSTRAINT fk_Contrato_CantidadOfrecida FOREIGN KEY (idContratoSubastadora, idContratoProductora, idNContrato)
REFERENCES CONTRATO (idSubastadora, idProductora, nContrato);
ALTER TABLE CANTIDAD_OFRECIDA
ADD CONSTRAINT fk_CatalogoProductor_CantidadOfrecida FOREIGN KEY (idCatalogoProductora, idCatalogoCorte, idVnb)
REFERENCES CATALOGOPRODUCTOR (idProductora, idCorte, vbn);
ALTER TABLE CANTIDAD_OFRECIDA
ADD CONSTRAINT chk_idCatalogoProductora_equals_idContratoProductora
CHECK (idCatalogoProductora = idContratoProductora);
-----------------------------------------------------------------------------------------------------------------
-- Crear la secuencia para PAGOS
CREATE SEQUENCE Pagos_seq START WITH 1 INCREMENT BY 1;
-- Crear la tabla
CREATE TABLE PAGOS(
idContratoSubastadora NUMERIC NOT NULL,
idContratoProductora NUMERIC NOT NULL,
idNContrato NUMERIC NOT NULL,
PagoId NUMERIC NOT NULL DEFAULT nextval('Pagos_seq'),
fechaPago DATE NOT NULL,
montoComision NUMERIC NOT NULL,
tipo VARCHAR NOT NULL,
PRIMARY KEY (idContratoSubastadora, idContratoProductora, idNContrato, PagoId)
);
-- Agregar claves foráneas y check
ALTER TABLE PAGOS
ADD CONSTRAINT fk_Contrato_Pagos FOREIGN KEY (idContratoSubastadora, idContratoProductora, idNContrato)
REFERENCES CONTRATO (idSubastadora, idProductora, nContrato);
ALTER TABLE PAGOS
ADD CONSTRAINT check_tipoProductor CHECK (tipo IN ('membresia', 'Pago','multa'));
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE CONTACTOS(
idFloristeria NUMERIC NOT NULL,
contactoId NUMERIC NOT NULL,
documentoIdentidad NUMERIC NOT NULL,
primerNombre VARCHAR NOT NULL,
primerApellido VARCHAR NOT NULL,
segundoApellido VARCHAR Not Null,
segundoNombre VARCHAR,
PRIMARY KEY (idFloristeria, contactoId)
);
-- Agregar claves foráneas
ALTER TABLE CONTACTOS
ADD CONSTRAINT fk_idFloristeria_contactos FOREIGN KEY (idFloristeria) REFERENCES FLORISTERIAS (floristeriaId);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE AFILIACION(
idFloristeria NUMERIC NOT NULL,
idSubastadora NUMERIC NOT NULL,
PRIMARY KEY (idFloristeria, idSubastadora)
);
-- Agregar claves foráneas
ALTER TABLE AFILIACION
ADD CONSTRAINT fk_idFloristeria_afiliacion FOREIGN KEY (idFloristeria) REFERENCES FLORISTERIAS (floristeriaId);
ALTER TABLE AFILIACION
ADD CONSTRAINT fk_idSubastadora_afiliacion FOREIGN KEY (idSubastadora) REFERENCES SUBASTADORA (subastadoraId);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE FACTURA(
facturaId NUMERIC NOT NULL,
idAfiliacionFloristeria NUMERIC NOT NULL,
idAfiliacionSubastadora NUMERIC NOT NULL,
fechaEmision TIMESTAMP NOT NULL,
montoTotal NUMERIC NOT NULL,
numeroEnvio NUMERIC,
PRIMARY KEY (facturaId)
);
-- Agregar claves foráneas
ALTER TABLE FACTURA
ADD CONSTRAINT fk_afiliacion_factura FOREIGN KEY (idAfiliacionFloristeria,idAfiliacionSubastadora) REFERENCES AFILIACION (idFloristeria, idSubastadora);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE LOTE(
idCantidadContratoSubastadora NUMERIC NOT NULL,
idCantidadContratoProductora NUMERIC NOT NULL,
idCantidad_NContrato NUMERIC NOT NULL,
idCantidadCatalogoProductora NUMERIC NOT NULL,
idCantidadCorte NUMERIC NOT NULL,
idCantidadvnb NUMERIC NOT NULL,
NumLote NUMERIC NOT NULL,
bi NUMERIC NOT NULL,
cantidad NUMERIC NOT NULL,
precioInicial NUMERIC NOT NULL,
precioFinal NUMERIC NOT NULL,
idFactura NUMERIC NOT NULL,
PRIMARY KEY (idCantidadContratoSubastadora, idCantidadContratoProductora, idCantidad_NContrato, idCantidadCatalogoProductora, idCantidadCorte, idCantidadvnb, NumLote)
);
-- Agregar claves foráneas
ALTER TABLE LOTE
ADD CONSTRAINT fk_CantidadOfrecida_Lote FOREIGN KEY (idCantidadContratoSubastadora, idCantidadContratoProductora, idCantidad_NContrato, idCantidadCatalogoProductora, idCantidadCorte, idCantidadvnb)
REFERENCES CANTIDAD_OFRECIDA (idContratoSubastadora, idContratoProductora, idNContrato, idCatalogoProductora, idCatalogoCorte, idVnb);
ALTER TABLE LOTE
ADD CONSTRAINT fk_idFactura_lote FOREIGN KEY (idFactura) REFERENCES FACTURA (facturaId);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE CATALOGO_FLORISTERIA(
idFloristeria NUMERIC NOT NULL,
codigo NUMERIC NOT NULL,
idCorteFlor NUMERIC NOT NULL,
idColor NUMERIC NOT NULL,
nombrePropio VARCHAR NOT NULL,
descripcion VARCHAR,
PRIMARY KEY (idFloristeria,codigo)
);
-- Agregar claves foráneas
ALTER TABLE CATALOGO_FLORISTERIA
ADD CONSTRAINT fk_idFloristeria_catalogofloristeria FOREIGN KEY (idFloristeria) REFERENCES FLORISTERIAS (floristeriaId);
ALTER TABLE CATALOGO_FLORISTERIA
ADD CONSTRAINT fk_idCorteFlor_catalogofloristeria FOREIGN KEY (idCorteFlor) REFERENCES FLOR_CORTES (corteId);
ALTER TABLE CATALOGO_FLORISTERIA
ADD CONSTRAINT fk_idCodigo_catalogofloristeria FOREIGN KEY (idColor) REFERENCES COLOR (colorId);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE HISTORICO_PRECIO_FLOR(
idCatalogoFloristeria NUMERIC NOT NULL,
idCatalogocodigo NUMERIC NOT NULL,
fechaInicio DATE NOT NULL,
fechaFin DATE,
precio NUMERIC NOT NULL,
tamanoTallo NUMERIC ,
PRIMARY KEY (idCatalogoFloristeria, idCatalogocodigo, fechaInicio)
);
-- Agregar claves foráneas
ALTER TABLE HISTORICO_PRECIO_FLOR
ADD Constraint fk_Catalogo_historicoPrecioFlor FOREIGN KEY (idCatalogoFloristeria, idCatalogocodigo) REFERENCES CATALOGO_FLORISTERIA (idFloristeria, codigo);
ALTER TABLE HISTORICO_PRECIO_FLOR
ADD Constraint check_fechaIni_fin CHECK (fechaFin IS NULL OR fechaInicio < fechaFin);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE DETALLE_BOUQUET(
idCatalogoFloristeria NUMERIC NOT NULL,
idCatalogocodigo NUMERIC NOT NULL,
bouquetId NUMERIC NOT NULL,
cantidad NUMERIC NOT NULL,
talloTamano NUMERIC,
descripcion VARCHAR,
PRIMARY KEY (idCatalogoFloristeria, idCatalogocodigo, bouquetId)
);
-- Agregar claves foráneas
ALTER TABLE DETALLE_BOUQUET
ADD Constraint fk_Catalogo_DetalleBouquet FOREIGN KEY (idCatalogoFloristeria, idCatalogocodigo) REFERENCES CATALOGO_FLORISTERIA (idFloristeria, codigo);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE FACTURA_FINAL(
idFloristeria NUMERIC NOT NULL,
numFactura NUMERIC NOT NULL,
fechaEmision DATE NOT NULL,
montoTotal NUMERIC NOT NULL,
idClienteNatural NUMERIC,
idClienteJuridico NUMERIC,
PRIMARY KEY (idFloristeria, numFactura)
);
-- Agregar claves foráneas
ALTER TABLE FACTURA_FINAL
ADD CONSTRAINT fk_idFloristeria_facturaFinal FOREIGN KEY (idFloristeria) REFERENCES FLORISTERIAS (floristeriaId);
ALTER TABLE FACTURA_FINAL
ADD CONSTRAINT fk_idCLienteNAatural_facturaFinal FOREIGN KEY (idClienteNatural) REFERENCES CLIENTE_NATURAL (cliNaturalId);
ALTER TABLE FACTURA_FINAL
ADD CONSTRAINT fk_idClienteJuridico_facturaFinal FOREIGN KEY (idClienteJuridico) REFERENCES CLIENTE_JURIDICO (cliJuridicoId);
-- Agregar restricción CHECK para asegurar que solo uno de los campos idClienteNatural o idClienteJuridico tenga un valor y el otro sea NULL
ALTER TABLE FACTURA_FINAL
ADD CONSTRAINT chk_FacturaFinal_ArcoExclusivo CHECK (
(idClienteNatural IS NOT NULL AND idClienteJuridico IS NULL) OR
(idClienteNatural IS NULL AND idClienteJuridico IS NOT NULL)
);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE DETALLE_FACTURA(
idFActuraFloristeria NUMERIC NOT NULL,
idNumFactura NUMERIC NOT NULL,
detalleId NUMERIC NOT NULL,
catalogoFloristeria NUMERIC,
catalogoCodigo NUMERIC,
bouquetFloristeria NUMERIC,
bouquetcodigo NUMERIC,
bouquetId NUMERIC,
cantidad NUMERIC NOT NULL,
valoracionPrecio NUMERIC,
valorancionCalidad NUMERIC,
valoracionPromedio NUMERIC,
detalles VARCHAR,
PRIMARY KEY (idFActuraFloristeria, idNumFactura, detalleId)
);
-- Agregar claves foráneas
ALTER TABLE DETALLE_FACTURA
ADD CONSTRAINT fk_idFactura_detalleFactura FOREIGN KEY (idFActuraFloristeria,idNumFactura) REFERENCES FACTURA_FINAL (idFloristeria, numFactura);
ALTER TABLE DETALLE_FACTURA
ADD CONSTRAINT fk_codigoCatalogo_detalleFactura FOREIGN KEY (catalogoFloristeria, catalogoCodigo) REFERENCES CATALOGO_FLORISTERIA (idFloristeria, codigo);
ALTER TABLE DETALLE_FACTURA
ADD CONSTRAINT fk_idBouquet_detalleFactura FOREIGN KEY (bouquetFloristeria, bouquetcodigo, bouquetId) REFERENCES DETALLE_BOUQUET (idCatalogoFloristeria, idCatalogocodigo, bouquetId);
-- Agregar restricción CHECK para asegurar que solo uno de los campos catalogoFloristeria/catalogoCodigo o bouquetFloristeria/bouquetcodigo/bouquetId tenga un valor y los otros sean NULL
ALTER TABLE DETALLE_FACTURA
ADD CONSTRAINT chk_detalle_ArcoExclusivo CHECK (
(catalogoFloristeria IS NOT NULL AND catalogoCodigo IS NOT NULL AND bouquetFloristeria IS NULL AND bouquetcodigo IS NULL AND bouquetId IS NULL) OR
(catalogoFloristeria IS NULL AND catalogoCodigo IS NULL AND bouquetFloristeria IS NOT NULL AND bouquetcodigo IS NOT NULL AND bouquetId IS NOT NULL)
);
--------------------------------------------------------------------------------------------------------------------
-- Crear la tabla
CREATE TABLE TELEFONOS(
codPais NUMERIC NOT NULL,
codArea NUMERIC NOT NULL,
numero NUMERIC NOT NULL,
idSubastadora NUMERIC,
idProductora NUMERIC,
idFloristeria NUMERIC,
PRIMARY KEY (codPais, codArea, numero)
);
-- Agregar claves foráneas
ALTER TABLE TELEFONOS
ADD CONSTRAINT fk_idSubastadora_telefonos FOREIGN KEY (idSubastadora) REFERENCES SUBASTADORA (subastadoraId);
ALTER TABLE TELEFONOS
ADD CONSTRAINT fk_idProductora_telefonos FOREIGN KEY (idProductora) REFERENCES PRODUCTORAS (productoraId);
ALTER TABLE TELEFONOS
ADD CONSTRAINT fk_idFloristeria_telefonos FOREIGN KEY (idFloristeria) REFERENCES FLORISTERIAS (floristeriaId);
-- Agregar restricción CHECK para asegurar que solo uno de los campos idSubastadora, idProductora o idFloristeria tenga un valor y los otros sean NULL
ALTER TABLE TELEFONOS
ADD CONSTRAINT chk_telefono_ArcoExclusivo CHECK (
(idSubastadora IS NOT NULL AND idProductora IS NULL AND idFloristeria IS NULL) OR
(idSubastadora IS NULL AND idProductora IS NOT NULL AND idFloristeria IS NULL) OR
(idSubastadora IS NULL AND idProductora IS NULL AND idFloristeria IS NOT NULL)
);
-------------------------------------------------------------------------------------------------------------------
-- =========================================================================================================== --
-- ======================================== Triggers y Programas ============================================= --
-- =========================================================================================================== --
-------------------------------------------------------------------------------------------------------------------
------------------------------------------------ Contratos -----------------------------------------------------
-- Crear la función para verificar la nacionalidad del productor en el contrato
CREATE OR REPLACE FUNCTION check_nacionalidad_productor_contrato() RETURNS TRIGGER AS $$
DECLARE
paisIdHolanda NUMERIC;
productoraPaisId NUMERIC;
BEGIN
SELECT paisId INTO paisIdHolanda FROM PAIS WHERE nombrePais = 'Holanda';
IF NEW.tipoProductor = 'Ka' THEN
SELECT idPais INTO productoraPaisId FROM PRODUCTORAS WHERE productoraId = NEW.idProductora;
IF productoraPaisId = paisIdHolanda THEN
RAISE EXCEPTION 'La productora no puede ser de Holanda para el tipo de productor Ka';
END IF;
ELSE
SELECT idPais INTO productoraPaisId FROM PRODUCTORAS WHERE productoraId = NEW.idProductora;
IF productoraPaisId <> paisIdHolanda THEN
RAISE EXCEPTION 'La productora debe ser de Holanda para otros tipos de productor';
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Crear el trigger para verificar la nacionalidad del productor en el contrato antes de insertar o actualizar
CREATE TRIGGER check_nacionalidad_productor_contrato
BEFORE INSERT OR UPDATE ON CONTRATO
FOR EACH ROW
EXECUTE FUNCTION check_nacionalidad_productor_contrato();
-- Crear la función para verificar la cantidad de contratos activos de una productora
CREATE OR REPLACE FUNCTION verificar_contrato_activo(idContratante NUMERIC, fecha DATE, CG BOOLEAN) RETURNS BOOLEAN AS $$
DECLARE
contratoActivo BOOLEAN;
BEGIN
contratoActivo := FALSE;
IF CG THEN
IF EXISTS (
SELECT 1
FROM CONTRATO
WHERE idProductora = idContratante
AND (tipoProductor <> 'Cg')
AND (cancelado IS NULL AND fechaemision > fecha - INTERVAL '1 year')
) THEN
contratoActivo := TRUE;
END IF;
IF EXISTS (
SELECT 1
FROM CONTRATO
WHERE idProductora = NEW.idProductora
AND idSubastadora = NEW.idSubastadora
AND (cancelado IS NULL AND fechaemision > fecha - INTERVAL '1 year')
) THEN
RAISE NOTICE 'No se puede insertar el contrato porque ya existe un contrato activo entre la productora y la subastadora';
END IF;
ELSE
IF EXISTS (
SELECT 1
FROM CONTRATO
WHERE idProductora = idContratante
AND (cancelado IS NULL AND fechaemision > fecha - INTERVAL '1 year')
) THEN
contratoActivo := TRUE;
END IF;
END IF;
RETURN contratoActivo;
END;
$$ LANGUAGE plpgsql;
-- Crear la función para verificar si existe un contrato activo para una productora
CREATE OR REPLACE FUNCTION check_contrato_activo() RETURNS TRIGGER AS $$
BEGIN
IF verificar_contrato_activo(NEW.idProductora, NEW.fechaemision, (NEW.tipoProductor = 'Cg')) THEN
RAISE EXCEPTION 'Ya existe un contrato activo para esta productora';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Crear el trigger para verificar si existe un contrato activo para una productora antes de insertar
CREATE TRIGGER check_contrato_activo
BEFORE INSERT ON CONTRATO
FOR EACH ROW
EXECUTE FUNCTION check_contrato_activo();
-- Funcion que verifica el porcentaje de produccion de contratos cg
CREATE OR REPLACE FUNCTION check_porcentaje_cg( Contratante NUMERIC, NuevoPorcentaje NUMERIC, fecha DATE) RETURNS BOOLEAN AS $$
DECLARE
PorcentajeActual NUMERIC := 0.00;
BEGIN
SELECT COALESCE(SUM(porcentajeProduccion), 0)
INTO PorcentajeActual
FROM CONTRATO
WHERE idProductora = Contratante
AND tipoProductor = 'Cg'
AND (cancelado IS NULL AND fechaemision > fecha - INTERVAL '1 year');
RETURN (PorcentajeActual + NuevoPorcentaje) <= 1.00;
END;
$$ LANGUAGE plpgsql;
-- Crear la función para crear un nuevo contrato
CREATE OR REPLACE FUNCTION crear_nuevo_contrato(
p_idSubastadora NUMERIC,
p_idProductora NUMERIC,
p_nContrato NUMERIC,
p_fechaemision DATE,
p_porcentajeProduccion NUMERIC(3,2),
p_tipoProductor VARCHAR,
p_idrenovS NUMERIC,
p_idrenovP NUMERIC,
p_ren_nContrato NUMERIC,
p_cancelado DATE
) RETURNS VOID AS $$
BEGIN
-- Verificar si existe un contrato activo para la productora
IF verificar_contrato_activo(p_idProductora, p_fechaemision, (p_tipoProductor = 'Cg')) THEN
RAISE NOTICE 'Ya existe un contrato activo para esta productora';
ELSE
-- Verificar si el porcentaje de producción es válido para el tipo de productor Cg
IF p_tipoProductor = 'Cg' AND NOT check_porcentaje_cg(p_idProductora, p_porcentajeProduccion, p_fechaemision) THEN
RAISE NOTICE 'El porcentaje de producción excede el 100 para el tipo de productor Cg';
ELSE
-- Insertar el nuevo contrato en la tabla CONTRATO
INSERT INTO CONTRATO (
idSubastadora, idProductora, nContrato, fechaemision, porcentajeProduccion, tipoProductor, idrenovS, idrenovP, ren_nContrato, cancelado
) VALUES (
p_idSubastadora, p_idProductora, p_nContrato, p_fechaemision, p_porcentajeProduccion, p_tipoProductor, p_idrenovS, p_idrenovP, p_ren_nContrato, p_cancelado
);
RAISE NOTICE 'Contrato creado exitosamente para la productora % con el contrato número %', p_idProductora, p_nContrato;
END IF;
END IF;
END;
$$ LANGUAGE plpgsql;
-- funcion para renovar los contratos
CREATE OR REPLACE FUNCTION renovar_contrato(
R_Subastadora NUMERIC,
R_idProductora NUMERIC,
R_nContrato NUMERIC,
Nuevo_nContrato NUMERIC,
fechaRenovacion DATE
) RETURNS VOID AS $$
DECLARE
R_porcentajeProduccion NUMERIC(3,2);
R_tipoProductor VARCHAR;
R_fechaEmision DATE;
R_fechaCancelacion DATE;
BEGIN
SELECT porcentajeProduccion, tipoProductor, fechaemision, cancelado
INTO R_porcentajeProduccion, R_tipoProductor, R_fechaEmision, R_fechaCancelacion
FROM CONTRATO
WHERE idSubastadora = R_Subastadora AND idProductora = R_idProductora AND nContrato = R_nContrato;
IF R_fechaCancelacion IS NULL THEN
IF fechaRenovacion <= R_fechaEmision + INTERVAL '1 year' THEN
RAISE EXCEPTION 'La fecha de renovación debe ser al menos un año mayor a la fecha de emisión del contrato anterior';
END IF;
ELSE
IF fechaRenovacion <= R_fechaCancelacion THEN
RAISE EXCEPTION 'La fecha de renovación debe ser mayor a la fecha de cancelación del contrato anterior';
END IF;
END IF;
INSERT INTO CONTRATO (
idSubastadora, idProductora, nContrato, fechaemision, porcentajeProduccion, tipoProductor, idrenovS, idrenovP, ren_nContrato, cancelado
) VALUES (
R_Subastadora, R_idProductora, Nuevo_nContrato, fechaRenovacion, R_porcentajeProduccion, R_tipoProductor, R_Subastadora, R_idProductora, R_nContrato, NULL
);
END;
$$ LANGUAGE plpgsql;
-- Function to cancel a contract
CREATE OR REPLACE FUNCTION cancelar_contrato(
p_idSubastadora NUMERIC,
p_idProductora NUMERIC,
p_nContrato NUMERIC,
p_fecha_cancelacion DATE
) RETURNS VOID AS $$
BEGIN
UPDATE CONTRATO
SET cancelado = p_fecha_cancelacion
WHERE idSubastadora = p_idSubastadora
AND idProductora = p_idProductora
AND nContrato = p_nContrato;
END;
$$ LANGUAGE plpgsql;
-- Crear la función para verificar que solo se puede modificar el atributo cancelado cuando es NULL
CREATE OR REPLACE FUNCTION verificar_update_contrato() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF NEW.cancelado IS NOT NULL AND OLD.cancelado IS NULL THEN
RETURN NEW;
ELSE
RAISE EXCEPTION 'Solo se puede modificar el atributo cancelado y solo cuando este es NULL';
END IF;
IF NEW.cancelado IS NOT NULL AND NEW.cancelado <= OLD.fechaemision THEN
RAISE EXCEPTION 'La fecha de cancelación debe ser posterior a la fecha de emisión del contrato';
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Crear el trigger para verificar la actualización del contrato
CREATE TRIGGER verificar_update_contrato
BEFORE UPDATE ON CONTRATO
FOR EACH ROW
EXECUTE FUNCTION verificar_update_contrato();
-------------------------------------------------- Pagos -------------------------------------------------------
-- Crear la función para pagar un contrato ( insert en Pago )
CREATE OR REPLACE FUNCTION Pago_contrato(
Pago_idContratoSubastadora NUMERIC,
Pago_idContratoProductora NUMERIC,
Pago_idNContrato NUMERIC,
Pago_fechaPago DATE
) RETURNS VOID AS $$
BEGIN
-- Obtener la fecha de emisión del contrato
IF Pago_fechaPago IS NULL THEN
SELECT fechaemision INTO Pago_fechaPago
FROM CONTRATO
WHERE idSubastadora = idContratoSubastadora
AND idProductora = idContratoProductora
AND nContrato = idNContrato;
END IF;
-- Insertar el Pago en la tabla PAGOS
INSERT INTO PAGOS (idContratoSubastadora, idContratoProductora, idNContrato, fechaPago, montoComision, tipo)
VALUES (Pago_idContratoSubastadora, Pago_idContratoProductora, Pago_idNContrato, Pago_fechaPago, 500.00, 'membresia');
END;
$$ LANGUAGE plpgsql;
-- Trigger para pagar un contrato después de insertar un contrato
CREATE OR REPLACE FUNCTION Pago_contrato_nuevo() RETURNS TRIGGER AS $$
BEGIN
PERFORM Pago_contrato(NEW.idSubastadora, NEW.idProductora, NEW.nContrato, NEW.fechaemision);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER Pago_contrato_nuevo
AFTER INSERT ON CONTRATO
FOR EACH ROW
EXECUTE FUNCTION Pago_contrato_nuevo();
-- Crear la función para verificar la fecha de Pago
CREATE OR REPLACE FUNCTION check_fecha_Pago() RETURNS TRIGGER AS $$
DECLARE
ultima_fecha_Pago DATE;
BEGIN
SELECT MAX(fechaPago) INTO ultima_fecha_Pago
FROM PAGOS
WHERE idContratoSubastadora = NEW.idContratoSubastadora
AND idContratoProductora = NEW.idContratoProductora
AND idNContrato = NEW.idNContrato;
IF ultima_fecha_Pago IS NOT NULL AND NEW.fechaPago <= ultima_fecha_Pago THEN
RAISE EXCEPTION 'La fecha de Pago debe ser mayor a la última fecha de Pago registrada';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Crear el trigger para verificar la fecha de Pago antes de insertar
CREATE TRIGGER check_fecha_Pago
BEFORE INSERT ON PAGOS
FOR EACH ROW
EXECUTE FUNCTION check_fecha_Pago();
-- Insertar datos de prueba en la tabla PAGOS con condición de que el tipo sea diferente a 'membresia'
-- Crear la función para insertar Pagos con la condición de que el tipo no sea 'membresia'
CREATE OR REPLACE FUNCTION insertar_Pago(
p_idContratoSubastadora NUMERIC,
p_idContratoProductora NUMERIC,
p_idNContrato NUMERIC,
p_fechaPago DATE,
p_montoComision NUMERIC,
p_tipo VARCHAR
) RETURNS VOID AS $$
BEGIN
IF p_tipo <> 'membresia' THEN
IF p_tipo = 'Pago' THEN
-- Calcular el monto de la comisión según la función MontoComision
IF p_montoComision <> MontoComision(p_idNContrato, p_fechaPago) THEN
RAISE EXCEPTION 'El monto de la comisión no coincide con el monto calculado';
END IF;
END IF;
--IF p_tipo = 'multa' THEN
INSERT INTO PAGOS (idContratoSubastadora, idContratoProductora, idNContrato, fechaPago, montoComision, tipo)
VALUES (p_idContratoSubastadora, p_idContratoProductora, p_idNContrato, p_fechaPago, p_montoComision, p_tipo);
ELSE
RAISE NOTICE 'El Pago de menbresia se hara al registrar el contrato, como parte de este';
END IF;
END;
$$ LANGUAGE plpgsql;
-------------------------------------------------------------------------------------------------------------------
-- =========================================================================================================== --
-- ======================================= Programas y Reportes ============================================= --
-- =========================================================================================================== --
-------------------------------------------------------------------------------------------------------------------
-- Crear la función para obtener el total de ventas en un periodo
CREATE OR REPLACE FUNCTION ventas_periodo(NumContrato NUMERIC, InicioPeriodo DATE, FinPeriodo DATE)
RETURNS NUMERIC AS $$
DECLARE
total_ventas NUMERIC := 0;
BEGIN
SELECT COALESCE(SUM(precioFinal), 0)
INTO total_ventas
FROM LOTE
WHERE idCantidad_NContrato = NumContrato
AND idFactura IN (
SELECT facturaId
FROM FACTURA
WHERE fechaEmision BETWEEN InicioPeriodo AND FinPeriodo
);
RETURN total_ventas;
END;
$$ LANGUAGE plpgsql;
-- Crear la función para obtener el monto de la comisión
CREATE OR REPLACE FUNCTION MontoComision(NumContrato NUMERIC, FechaComision DATE)
RETURNS NUMERIC AS $$
DECLARE
monto NUMERIC := 0;
tipo VARCHAR(2);
inicioMes DATE;
FinMes DATE;
BEGIN
inicioMes := date_trunc('month', FechaComision);
FinMes := date_trunc('month', FechaComision) + INTERVAL '1 month' - INTERVAL '1 day';
SELECT tipoProductor INTO tipo
FROM CONTRATO
WHERE nContrato = NumContrato;
-- Calcular el monto de la comisión según el tipo de productor
IF tipo = 'Ca' THEN
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.005;
ELSIF tipo = 'Cb' THEN
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.01;
ELSIF tipo = 'Cc' THEN
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.02;
ELSIF tipo = 'Cg' THEN
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.05;
ELSIF tipo = 'Ka' THEN
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.0025;
END IF;
RETURN monto;
END;
$$ LANGUAGE plpgsql;
-- Crear la función para verificar la fecha de Pago dentro del período de validez del contrato
CREATE OR REPLACE FUNCTION verificar_fecha_Pago_validez() RETURNS TRIGGER AS $$
DECLARE
fecha_emision DATE;
fecha_cancelacion DATE;
BEGIN
IF NEW.tipo <> 'membresia' THEN
-- Obtener la fecha de emisión y la fecha de cancelación del contrato
SELECT fechaemision, cancelado INTO fecha_emision, fecha_cancelacion
FROM CONTRATO
WHERE idSubastadora = NEW.idContratoSubastadora
AND idProductora = NEW.idContratoProductora
AND nContrato = NEW.idNContrato;
-- Verificar que la fecha de Pago esté dentro del período de validez del contrato
IF NEW.fechaPago <= fecha_emision THEN
RAISE EXCEPTION 'La fecha de Pago debe ser mayor a la fecha de emisión del contrato';
ELSIF fecha_cancelacion IS NOT NULL AND NEW.fechaPago >= fecha_cancelacion THEN
RAISE EXCEPTION 'La fecha de Pago debe ser menor a la fecha de cancelación del contrato';
ELSIF fecha_cancelacion IS NULL AND NEW.fechaPago >= fecha_emision + INTERVAL '1 year' THEN
RAISE EXCEPTION 'La fecha de Pago debe ser menor a un año desde la fecha de emisión del contrato';
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Crear el trigger para verificar la fecha de Pago antes de insertar en PAGOS
CREATE TRIGGER verificar_fecha_Pago_validez
BEFORE INSERT ON PAGOS
FOR EACH ROW
EXECUTE FUNCTION verificar_fecha_Pago_validez();
-- Crear la función para insertar un Pago
CREATE OR REPLACE FUNCTION insertar_Pago(
p_idContratoSubastadora NUMERIC,
p_idContratoProductora NUMERIC,
p_idNContrato NUMERIC,
p_fechaPago DATE,
p_montoComision NUMERIC,
p_tipo VARCHAR
) RETURNS VOID AS $$
BEGIN
-- Verificar que el tipo de Pago no sea 'membresia'
IF p_tipo <> 'membresia' THEN
-- Insertar el Pago en la tabla PAGOS
IF p_tipo = 'Pago' THEN
IF p_montoComision <> MontoComision(p_idNContrato, p_fechaPago) THEN
RAISE NOTICE 'El monto de la comisión no coincide con el monto calculado';
END IF;
END IF;
INSERT INTO PAGOS (idContratoSubastadora, idContratoProductora, idNContrato, fechaPago, montoComision, tipo)
VALUES (p_idContratoSubastadora, p_idContratoProductora, p_idNContrato, p_fechaPago, p_montoComision, p_tipo);
ELSE
RAISE NOTICE 'El Pago de membresía se realiza al registrar el contrato, como parte de este';
END IF;
END;
$$ LANGUAGE plpgsql;
------------------------------------------------ multas ---------------------------------------------------------
-- Crear la función para obtener el monto de la multa
CREATE OR REPLACE FUNCTION MontoMulta(NumContrato NUMERIC, Fechamulta DATE)
RETURNS NUMERIC AS $$
DECLARE
monto NUMERIC := 0;
tipo VARCHAR(2);
inicioMes DATE;
FinMes DATE;
BEGIN
inicioMes := date_trunc('month', Fechamulta);
FinMes := date_trunc('month', Fechamulta) + INTERVAL '1 month' - INTERVAL '1 day';
monto := ventas_periodo(NumContrato, inicioMes, FinMes) * 0.2;
RETURN monto;
END;
$$ LANGUAGE plpgsql;
-- FUNCTION: public.obtener_valoraciones_por_floristeria(numeric)
-- DROP FUNCTION IF EXISTS public.obtener_valoraciones_por_floristeria(numeric);
CREATE OR REPLACE FUNCTION obtener_valoraciones_por_floristeria(p_idfloristeria NUMERIC)
RETURNS TABLE (
corteid NUMERIC,
nombrecomun VARCHAR,
valoracion_promedio NUMERIC
) AS $$