summaryrefslogtreecommitdiff
path: root/db/migrations/0142_familiar_corsair.sql
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrations/0142_familiar_corsair.sql')
-rw-r--r--db/migrations/0142_familiar_corsair.sql104
1 files changed, 104 insertions, 0 deletions
diff --git a/db/migrations/0142_familiar_corsair.sql b/db/migrations/0142_familiar_corsair.sql
new file mode 100644
index 00000000..6233c71e
--- /dev/null
+++ b/db/migrations/0142_familiar_corsair.sql
@@ -0,0 +1,104 @@
+DROP VIEW "public"."vendor_response_detail";--> statement-breakpoint
+CREATE VIEW "public"."vendor_response_detail" AS (
+ SELECT
+ var.id as response_id,
+ ba.rfq_id,
+ br.rfq_code,
+ var.rfq_type,
+ var.rfq_record_id,
+
+ -- 첨부파일 정보
+ ba.id as attachment_id,
+ ba.attachment_type,
+ ba.serial_no,
+ ba.description as attachment_description,
+
+ -- 벤더 정보
+ v.id as vendor_id,
+ v.vendor_code,
+ v.vendor_name,
+ v.country as vendor_country,
+
+ -- 응답 상태
+ var.response_status,
+ var.current_revision,
+ var.responded_revision,
+
+ -- 코멘트 (새로 추가된 필드 포함)
+ var.response_comment,
+ var.vendor_comment,
+ var.revision_request_comment,
+
+ -- 날짜 (새로 추가된 필드 포함)
+ var.requested_at,
+ var.responded_at,
+ var.revision_requested_at,
+
+ -- 발주처 최신 리비전
+ latest_rev.revision_no as latest_client_revision_no,
+ latest_rev.original_file_name as latest_client_file_name,
+ latest_rev.file_size as latest_client_file_size,
+ latest_rev.revision_comment as latest_client_revision_comment,
+
+ -- 리비전 분석
+ CASE
+ WHEN var.responded_revision = ba.current_revision THEN true
+ ELSE false
+ END as is_version_matched,
+
+ CASE
+ WHEN var.responded_revision IS NULL OR ba.current_revision IS NULL THEN NULL
+ ELSE CAST(SUBSTRING(ba.current_revision FROM '[0-9]+') AS INTEGER) -
+ CAST(SUBSTRING(var.responded_revision FROM '[0-9]+') AS INTEGER)
+ END as version_lag,
+
+ CASE
+ WHEN var.response_status = 'RESPONDED'
+ AND var.responded_revision != ba.current_revision THEN true
+ ELSE false
+ END as needs_update,
+
+ CASE
+ WHEN revision_count.total_revisions > 1 THEN true
+ ELSE false
+ END as has_multiple_revisions,
+
+ -- 응답 파일 정보
+ COALESCE(file_stats.total_files, 0) as total_response_files,
+ file_stats.latest_file_name as latest_response_file_name,
+ file_stats.latest_file_size as latest_response_file_size,
+ file_stats.latest_uploaded_at as latest_response_uploaded_at,
+
+ -- 효과적인 상태
+ CASE
+ WHEN var.response_status = 'NOT_RESPONDED' THEN 'NOT_RESPONDED'
+ WHEN var.response_status = 'WAIVED' THEN 'WAIVED'
+ WHEN var.response_status = 'REVISION_REQUESTED' THEN 'REVISION_REQUESTED'
+ WHEN var.response_status = 'RESPONDED' AND var.responded_revision = ba.current_revision THEN 'UP_TO_DATE'
+ WHEN var.response_status = 'RESPONDED' AND var.responded_revision != ba.current_revision THEN 'VERSION_MISMATCH'
+ ELSE var.response_status
+ END as effective_status
+
+ FROM vendor_attachment_responses var
+ JOIN b_rfq_attachments ba ON var.attachment_id = ba.id
+ JOIN b_rfqs br ON ba.rfq_id = br.id
+ LEFT JOIN vendors v ON var.vendor_id = v.id
+ LEFT JOIN b_rfq_attachment_revisions latest_rev ON ba.latest_revision_id = latest_rev.id
+ LEFT JOIN (
+ SELECT
+ attachment_id,
+ COUNT(*) as total_revisions
+ FROM b_rfq_attachment_revisions
+ GROUP BY attachment_id
+ ) revision_count ON ba.id = revision_count.attachment_id
+ LEFT JOIN (
+ SELECT
+ vendor_response_id,
+ COUNT(*) as total_files,
+ MAX(original_file_name) as latest_file_name,
+ MAX(file_size) as latest_file_size,
+ MAX(uploaded_at) as latest_uploaded_at
+ FROM vendor_response_attachments_b
+ GROUP BY vendor_response_id
+ ) file_stats ON var.id = file_stats.vendor_response_id
+); \ No newline at end of file