| 1 | --1
|
|---|
| 2 | -- View: Shows current stock per warehouse, product, and variant (total, reserved, available)
|
|---|
| 3 | -- drop view view_current_warehouse_stock;
|
|---|
| 4 | CREATE OR REPLACE VIEW view_current_warehouse_stock AS
|
|---|
| 5 | SELECT agg.warehouse_id,
|
|---|
| 6 | w.name AS warehouse_name,
|
|---|
| 7 |
|
|---|
| 8 | agg.product_id,
|
|---|
| 9 | p.name AS product_name,
|
|---|
| 10 |
|
|---|
| 11 | agg.variant_id,
|
|---|
| 12 | pv.sku,
|
|---|
| 13 |
|
|---|
| 14 | agg.total_quantity,
|
|---|
| 15 | agg.reserved_quantity,
|
|---|
| 16 | agg.available_quantity
|
|---|
| 17 |
|
|---|
| 18 | FROM (SELECT s.warehouse_id,
|
|---|
| 19 | pv.product_id,
|
|---|
| 20 | pv.id AS variant_id,
|
|---|
| 21 |
|
|---|
| 22 | SUM(i.quantity) AS total_quantity,
|
|---|
| 23 | SUM(i.reserved_quantity) AS reserved_quantity,
|
|---|
| 24 | SUM(i.quantity - i.reserved_quantity) AS available_quantity
|
|---|
| 25 |
|
|---|
| 26 | FROM inventory i
|
|---|
| 27 |
|
|---|
| 28 | JOIN bins b
|
|---|
| 29 | ON b.id = i.bin_id
|
|---|
| 30 |
|
|---|
| 31 | JOIN locations l
|
|---|
| 32 | ON l.id = b.location_id
|
|---|
| 33 |
|
|---|
| 34 | JOIN sections s
|
|---|
| 35 | ON s.id = l.section_id
|
|---|
| 36 |
|
|---|
| 37 | JOIN product_variants pv
|
|---|
| 38 | ON pv.id = i.product_variant_id
|
|---|
| 39 |
|
|---|
| 40 | GROUP BY s.warehouse_id,
|
|---|
| 41 | pv.product_id,
|
|---|
| 42 | pv.id) agg
|
|---|
| 43 |
|
|---|
| 44 | JOIN warehouses w
|
|---|
| 45 | ON w.id = agg.warehouse_id
|
|---|
| 46 |
|
|---|
| 47 | JOIN product_variants pv
|
|---|
| 48 | ON pv.id = agg.variant_id
|
|---|
| 49 |
|
|---|
| 50 | JOIN products p
|
|---|
| 51 | ON p.id = agg.product_id;
|
|---|
| 52 |
|
|---|
| 53 | SELECT *
|
|---|
| 54 | FROM view_current_warehouse_stock;
|
|---|
| 55 |
|
|---|
| 56 | SELECT *
|
|---|
| 57 | FROM view_current_warehouse_stock
|
|---|
| 58 | WHERE warehouse_id = 2;
|
|---|
| 59 |
|
|---|
| 60 | SELECT *
|
|---|
| 61 | FROM view_current_warehouse_stock
|
|---|
| 62 | WHERE product_id = 2;
|
|---|
| 63 |
|
|---|
| 64 | SELECT *
|
|---|
| 65 | FROM view_current_warehouse_stock
|
|---|
| 66 | WHERE variant_id = 10000;
|
|---|
| 67 |
|
|---|
| 68 | --2
|
|---|
| 69 | CREATE OR REPLACE VIEW view_category_descendants AS
|
|---|
| 70 | WITH RECURSIVE descendants AS (SELECT c.id AS root_id, c.id AS category_id
|
|---|
| 71 | FROM categories c
|
|---|
| 72 |
|
|---|
| 73 | UNION ALL
|
|---|
| 74 |
|
|---|
| 75 | SELECT d.root_id, c.id
|
|---|
| 76 | FROM categories c
|
|---|
| 77 | JOIN descendants d ON c.parent_id = d.category_id)
|
|---|
| 78 | SELECT root_id, category_id
|
|---|
| 79 | FROM descendants;
|
|---|
| 80 |
|
|---|
| 81 | SELECT *
|
|---|
| 82 | FROM view_category_descendants;
|
|---|
| 83 |
|
|---|
| 84 | CREATE OR REPLACE VIEW view_product_category_flat AS
|
|---|
| 85 | SELECT c.id AS category_id,
|
|---|
| 86 | c.name AS category_name,
|
|---|
| 87 | p.id AS product_id,
|
|---|
| 88 | p.name AS product_name,
|
|---|
| 89 | p.description
|
|---|
| 90 | FROM product_categories pc
|
|---|
| 91 | JOIN categories c ON c.id = pc.category_id
|
|---|
| 92 | JOIN products p ON p.id = pc.product_id;
|
|---|
| 93 |
|
|---|
| 94 | -- View: Lists all products grouped by their categories
|
|---|
| 95 | -- drop view view_products_by_category;
|
|---|
| 96 | CREATE OR REPLACE VIEW view_products_by_category AS
|
|---|
| 97 | SELECT d.root_id AS main_category_id,
|
|---|
| 98 | main_c.name AS main_category_name,
|
|---|
| 99 |
|
|---|
| 100 | pc.category_id AS subcategory_id,
|
|---|
| 101 | pc.category_name AS subcategory_name,
|
|---|
| 102 |
|
|---|
| 103 | pc.product_id,
|
|---|
| 104 | pc.product_name,
|
|---|
| 105 | pc.description
|
|---|
| 106 | FROM view_category_descendants d
|
|---|
| 107 | JOIN view_product_category_flat pc
|
|---|
| 108 | ON pc.category_id = d.category_id
|
|---|
| 109 | JOIN categories main_c
|
|---|
| 110 | ON main_c.id = d.root_id;
|
|---|
| 111 |
|
|---|
| 112 | SELECT *
|
|---|
| 113 | FROM view_products_by_category
|
|---|
| 114 | WHERE main_category_id = 8;
|
|---|
| 115 |
|
|---|
| 116 | SELECT *
|
|---|
| 117 | FROM view_products_by_category
|
|---|
| 118 | WHERE main_category_name = 'pants';
|
|---|
| 119 |
|
|---|
| 120 | SELECT *
|
|---|
| 121 | FROM view_products_by_category
|
|---|
| 122 | WHERE product_id = 5;
|
|---|
| 123 |
|
|---|
| 124 | SELECT *
|
|---|
| 125 | FROM view_products_by_category;
|
|---|
| 126 |
|
|---|
| 127 | --3
|
|---|
| 128 | -- View: Shows all variants for each product with detailed variant information
|
|---|
| 129 | CREATE OR REPLACE VIEW view_variants_per_product AS
|
|---|
| 130 | SELECT p.id AS product_id,
|
|---|
| 131 | p.name AS product_name,
|
|---|
| 132 | pv.id AS variant_id,
|
|---|
| 133 | pv.sku,
|
|---|
| 134 | pv.brand_id,
|
|---|
| 135 | pv.barcode,
|
|---|
| 136 | pv.price,
|
|---|
| 137 | pv.status,
|
|---|
| 138 | pv.weight,
|
|---|
| 139 | pv.created_at
|
|---|
| 140 | FROM product_variants pv
|
|---|
| 141 | JOIN products p ON p.id = pv.product_id
|
|---|
| 142 | ORDER BY product_name;
|
|---|
| 143 |
|
|---|
| 144 | SELECT *
|
|---|
| 145 | FROM view_variants_per_product
|
|---|
| 146 | WHERE product_id = 13;
|
|---|
| 147 |
|
|---|
| 148 | SELECT *
|
|---|
| 149 | FROM view_variants_per_product;
|
|---|
| 150 |
|
|---|
| 151 | --4
|
|---|
| 152 | -- View: Aggregates inventory quantities per product variant
|
|---|
| 153 | CREATE OR REPLACE VIEW view_inventory_summary AS
|
|---|
| 154 | SELECT product_variant_id,
|
|---|
| 155 | SUM(quantity) AS total_quantity,
|
|---|
| 156 | SUM(reserved_quantity) AS reserved_quantity,
|
|---|
| 157 | SUM(quantity - reserved_quantity) AS available_quantity
|
|---|
| 158 | FROM INVENTORY
|
|---|
| 159 | GROUP BY product_variant_id;
|
|---|
| 160 |
|
|---|
| 161 | SELECT *
|
|---|
| 162 | FROM view_inventory_summary;
|
|---|
| 163 |
|
|---|
| 164 | SELECT *
|
|---|
| 165 | FROM view_inventory_summary
|
|---|
| 166 | where product_variant_id = 312312;
|
|---|
| 167 |
|
|---|
| 168 | SELECT *
|
|---|
| 169 | FROM view_inventory_summary
|
|---|
| 170 | WHERE available_quantity < 10;
|
|---|
| 171 |
|
|---|
| 172 | --5
|
|---|
| 173 | -- View: Shows employees with their currently assigned warehouse and their manager
|
|---|
| 174 | CREATE OR REPLACE VIEW view_employee_current_warehouse AS
|
|---|
| 175 | SELECT e.id AS employee_id,
|
|---|
| 176 | e.employee_number,
|
|---|
| 177 | e.first_name,
|
|---|
| 178 | e.last_name,
|
|---|
| 179 | e.job_title,
|
|---|
| 180 | e.employment_status,
|
|---|
| 181 | m.id AS manager_id,
|
|---|
| 182 | m.first_name || ' ' || m.last_name AS manager_name,
|
|---|
| 183 | w.id AS warehouse_id,
|
|---|
| 184 | w.name AS warehouse_name,
|
|---|
| 185 | ewa.is_primary,
|
|---|
| 186 | ewa.start_date
|
|---|
| 187 | FROM employees e
|
|---|
| 188 | LEFT JOIN employee_warehouse_assignments ewa
|
|---|
| 189 | ON ewa.employee_id = e.id
|
|---|
| 190 | AND ewa.end_date IS NULL
|
|---|
| 191 | AND ewa.is_primary = TRUE
|
|---|
| 192 |
|
|---|
| 193 | LEFT JOIN warehouses w
|
|---|
| 194 | ON w.id = ewa.warehouse_id
|
|---|
| 195 |
|
|---|
| 196 | LEFT JOIN employees m
|
|---|
| 197 | ON m.id = e.manager_id
|
|---|
| 198 |
|
|---|
| 199 | WHERE e.terminated_at IS NULL;
|
|---|
| 200 |
|
|---|
| 201 | SELECT *
|
|---|
| 202 | FROM view_employee_current_warehouse;
|
|---|
| 203 |
|
|---|
| 204 | SELECT *
|
|---|
| 205 | FROM view_employee_current_warehouse
|
|---|
| 206 | where employee_id = 685;
|
|---|
| 207 |
|
|---|
| 208 | SELECT *
|
|---|
| 209 | FROM view_employee_current_warehouse
|
|---|
| 210 | where warehouse_id = 12;
|
|---|
| 211 |
|
|---|
| 212 | --6
|
|---|
| 213 | -- View: Lists employee roles and their associated permissions
|
|---|
| 214 | --drop view view_employee_permissions;
|
|---|
| 215 | CREATE OR REPLACE VIEW view_employee_permissions AS
|
|---|
| 216 | SELECT e.first_name || ' ' || e.last_name AS employee_full_name,
|
|---|
| 217 | e.id AS employee_id,
|
|---|
| 218 | r.name AS role,
|
|---|
| 219 | p.name AS permission
|
|---|
| 220 | FROM EMPLOYEES e
|
|---|
| 221 | JOIN ROLES_EMPLOYEES re ON re.employees_id = e.id
|
|---|
| 222 | JOIN ROLES r ON r.id = re.roles_id
|
|---|
| 223 | JOIN PERMISSIONS_ROLES pr ON pr.roles_id = r.id
|
|---|
| 224 | JOIN PERMISSIONS p ON p.id = pr.permissions_id;
|
|---|
| 225 |
|
|---|
| 226 | SELECT *
|
|---|
| 227 | FROM view_employee_permissions
|
|---|
| 228 | WHERE employee_id = 22;
|
|---|
| 229 |
|
|---|
| 230 | SELECT *
|
|---|
| 231 | FROM view_employee_permissions;
|
|---|
| 232 |
|
|---|
| 233 |
|
|---|
| 234 | -- 7
|
|---|
| 235 | -- View: Detailed inventory movement records including bins and responsible employee
|
|---|
| 236 | -- drop view view_inventory_movements_detailed;
|
|---|
| 237 | CREATE OR REPLACE VIEW view_inventory_movements_detailed AS
|
|---|
| 238 | SELECT im.id,
|
|---|
| 239 | im.product_variant_id,
|
|---|
| 240 | im.quantity,
|
|---|
| 241 | im.created_at,
|
|---|
| 242 | from_bin.bin_code AS from_bin,
|
|---|
| 243 | to_bin.bin_code AS to_bin,
|
|---|
| 244 | it.id as inventory_transaction_id,
|
|---|
| 245 | it.transaction_type,
|
|---|
| 246 | e.first_name || ' ' || e.last_name AS created_by,
|
|---|
| 247 | e.id as employee_id
|
|---|
| 248 | FROM INVENTORY_MOVEMENTS im
|
|---|
| 249 | LEFT JOIN BINS from_bin ON from_bin.id = im.from_bin_id
|
|---|
| 250 | LEFT JOIN BINS to_bin ON to_bin.id = im.to_bin_id
|
|---|
| 251 | JOIN INVENTORY_TRANSACTIONS it ON it.id = im.inventory_transactions_id
|
|---|
| 252 | JOIN EMPLOYEES e ON e.id = it.created_by_employee;
|
|---|
| 253 |
|
|---|
| 254 |
|
|---|
| 255 | SELECT *
|
|---|
| 256 | FROM view_inventory_movements_detailed
|
|---|
| 257 | WHERE inventory_transaction_id = 3200376;
|
|---|
| 258 |
|
|---|
| 259 | SELECT *
|
|---|
| 260 | FROM view_inventory_movements_detailed
|
|---|
| 261 | WHERE created_at >= '2025-01-01 00:00:00.000000';
|
|---|
| 262 |
|
|---|
| 263 | SELECT *
|
|---|
| 264 | FROM view_inventory_movements_detailed
|
|---|
| 265 | WHERE employee_id = 1674;
|
|---|
| 266 |
|
|---|
| 267 | SELECT *
|
|---|
| 268 | FROM view_inventory_movements_detailed
|
|---|
| 269 | WHERE transaction_type = 'TRANSFER';
|
|---|
| 270 |
|
|---|
| 271 |
|
|---|
| 272 | ANALYZE inventory_transactions;
|
|---|
| 273 | ANALYZE inventory_movements;
|
|---|
| 274 |
|
|---|
| 275 | --8
|
|---|
| 276 | -- View: Lists all attributes and values assigned to each product variant
|
|---|
| 277 | drop view view_variant_details;
|
|---|
| 278 |
|
|---|
| 279 | CREATE OR REPLACE VIEW view_variant_details AS
|
|---|
| 280 | SELECT pv.id AS variant_id,
|
|---|
| 281 | b.name brand_name,
|
|---|
| 282 | p.name AS product_name,
|
|---|
| 283 | c.name as category_name,
|
|---|
| 284 | pv.price,
|
|---|
| 285 | pv.status,
|
|---|
| 286 | pv.sku,
|
|---|
| 287 | pv.product_id,
|
|---|
| 288 | a.name AS attribute_name,
|
|---|
| 289 | av.value AS attribute_value,
|
|---|
| 290 | a.data_type,
|
|---|
| 291 | a.unit,
|
|---|
| 292 | pim.url
|
|---|
| 293 | FROM PRODUCT_VARIANTS pv
|
|---|
| 294 | JOIN VARIANT_ATTRIBUTES va ON va.product_variant_id = pv.id
|
|---|
| 295 | JOIN ATTRIBUTE_VALUES av ON av.id = va.attribute_value_id
|
|---|
| 296 | AND av.attribute_id = va.attribute_id
|
|---|
| 297 | JOIN ATTRIBUTES a ON a.id = va.attribute_id
|
|---|
| 298 | JOIN products p on pv.product_id = p.id
|
|---|
| 299 | JOIN brands as b on pv.brand_id = b.id
|
|---|
| 300 | LEFT JOIN product_images as pim on pv.id = pim.product_variants_id
|
|---|
| 301 | JOIN product_categories pc on p.id = pc.product_id
|
|---|
| 302 | JOIN categories c on pc.category_id = c.id;
|
|---|
| 303 |
|
|---|
| 304 | SELECT *
|
|---|
| 305 | FROM view_variant_details;
|
|---|
| 306 |
|
|---|
| 307 | SELECT *
|
|---|
| 308 | FROM view_variant_details
|
|---|
| 309 | where variant_id = 291588;
|
|---|
| 310 |
|
|---|
| 311 | SELECT *
|
|---|
| 312 | FROM view_variant_details
|
|---|
| 313 | WHERE variant_id = 6;
|
|---|
| 314 |
|
|---|
| 315 | --9
|
|---|
| 316 | --View: Builds a hierarchical category tree with depth and full path (breadcrumb)
|
|---|
| 317 | CREATE OR REPLACE VIEW view_category_tree AS
|
|---|
| 318 | WITH RECURSIVE tree AS (SELECT c.id,
|
|---|
| 319 | c.parent_id,
|
|---|
| 320 | c.name,
|
|---|
| 321 | 0 AS depth,
|
|---|
| 322 | c.name::text AS path
|
|---|
| 323 | FROM categories c
|
|---|
| 324 | WHERE c.parent_id IS NULL
|
|---|
| 325 |
|
|---|
| 326 | UNION ALL
|
|---|
| 327 |
|
|---|
| 328 | SELECT c.id,
|
|---|
| 329 | c.parent_id,
|
|---|
| 330 | c.name,
|
|---|
| 331 | t.depth + 1 AS depth,
|
|---|
| 332 | t.path || ' > ' || c.name AS path
|
|---|
| 333 | FROM categories c
|
|---|
| 334 | JOIN tree t ON t.id = c.parent_id)
|
|---|
| 335 | SELECT id AS category_id,
|
|---|
| 336 | parent_id,
|
|---|
| 337 | name AS category_name,
|
|---|
| 338 | depth,
|
|---|
| 339 | path
|
|---|
| 340 | FROM tree;
|
|---|
| 341 |
|
|---|
| 342 | SELECT *
|
|---|
| 343 | FROM view_category_tree;
|
|---|
| 344 |
|
|---|
| 345 | SELECT *
|
|---|
| 346 | FROM view_category_tree
|
|---|
| 347 | WHERE category_id = 8;
|
|---|