| | 1 | = Погледи = |
| | 2 | |
| | 3 | == Целосен преглед на нарачки == |
| | 4 | |
| | 5 | === Опис === |
| | 6 | |
| | 7 | Погледот прикажува целосен преглед на сите нарачки со детали за масата, келнерот, плаќањето и вкупниот износ. |
| | 8 | |
| | 9 | === Имплементација === |
| | 10 | |
| | 11 | {{{ |
| | 12 | CREATE OR REPLACE VIEW v_orders_full AS |
| | 13 | SELECT |
| | 14 | o.order_id, |
| | 15 | o.created_at, |
| | 16 | o.status AS order_status, |
| | 17 | rt.table_number, |
| | 18 | rt.capacity, |
| | 19 | u.first_name || ' ' || u.last_name AS waiter_name, |
| | 20 | r.role_name AS waiter_role, |
| | 21 | p.amount AS total_paid, |
| | 22 | p.method AS payment_method, |
| | 23 | p.payment_date, |
| | 24 | i.invoice_number, |
| | 25 | i.issued_at, |
| | 26 | COUNT(oi.item_number) AS total_items, |
| | 27 | SUM(oi.quantity) AS total_quantity |
| | 28 | FROM project.orders o |
| | 29 | JOIN project.restaurant_table rt ON rt.table_id = o.table_id |
| | 30 | JOIN project.app_user u ON u.user_id = o.user_id |
| | 31 | JOIN project.role r ON r.role_id = u.role_id |
| | 32 | LEFT JOIN project.payment p ON p.order_id = o.order_id |
| | 33 | LEFT JOIN project.invoice i ON i.payment_id = p.payment_id |
| | 34 | LEFT JOIN project.order_item oi ON oi.order_id = o.order_id |
| | 35 | GROUP BY o.order_id, o.created_at, o.status, rt.table_number, rt.capacity, |
| | 36 | u.first_name, u.last_name, r.role_name, |
| | 37 | p.amount, p.method, p.payment_date, |
| | 38 | i.invoice_number, i.issued_at |
| | 39 | ORDER BY o.created_at DESC; |
| | 40 | }}} |
| | 41 | |
| | 42 | == Преглед на маси со нивниот статус == |
| | 43 | |
| | 44 | === Опис === |
| | 45 | |
| | 46 | Погледот прикажува сите маси со нивниот статус и активна нарачка (ако има). |
| | 47 | |
| | 48 | === Имплементација === |
| | 49 | |
| | 50 | {{{ |
| | 51 | CREATE OR REPLACE VIEW v_tables_status AS |
| | 52 | SELECT |
| | 53 | rt.table_id, |
| | 54 | rt.table_number, |
| | 55 | rt.capacity, |
| | 56 | rt.status, |
| | 57 | o.order_id AS active_order_id, |
| | 58 | o.created_at AS order_time, |
| | 59 | u.first_name || ' ' || u.last_name AS waiter_name, |
| | 60 | COUNT(oi.item_number) AS items_in_order |
| | 61 | FROM project.restaurant_table rt |
| | 62 | LEFT JOIN project.orders o ON o.table_id = rt.table_id AND o.status != 'ПЛАТЕНА' |
| | 63 | LEFT JOIN project.app_user u ON u.user_id = o.user_id |
| | 64 | LEFT JOIN project.order_item oi ON oi.order_id = o.order_id |
| | 65 | GROUP BY rt.table_id, rt.table_number, rt.capacity, rt.status, |
| | 66 | o.order_id, o.created_at, u.first_name, u.last_name |
| | 67 | ORDER BY rt.table_number::int; |
| | 68 | }}} |
| | 69 | |
| | 70 | == Месечен приход по категорија == |
| | 71 | |
| | 72 | === Опис === |
| | 73 | |
| | 74 | Погледот го прикажува месечниот приход групиран по категорија. |
| | 75 | |
| | 76 | === Имплементација === |
| | 77 | |
| | 78 | {{{ |
| | 79 | CREATE OR REPLACE VIEW v_monthly_revenue_by_category AS |
| | 80 | SELECT |
| | 81 | TO_CHAR(o.created_at, 'YYYY-MM') AS month, |
| | 82 | c.category_id, |
| | 83 | c.name AS category_name, |
| | 84 | COUNT(DISTINCT o.order_id) AS order_count, |
| | 85 | SUM(oi.quantity) AS items_sold, |
| | 86 | SUM(oi.quantity * oi.unit_price) AS total_revenue, |
| | 87 | ROUND(AVG(oi.quantity * oi.unit_price), 2) AS avg_item_price |
| | 88 | FROM project.orders o |
| | 89 | JOIN project.order_item oi ON oi.order_id = o.order_id |
| | 90 | JOIN project.product p ON p.product_id = oi.product_id |
| | 91 | JOIN project.category c ON c.category_id = p.category_id |
| | 92 | WHERE o.status = 'ПЛАТЕНА' |
| | 93 | GROUP BY TO_CHAR(o.created_at, 'YYYY-MM'), c.category_id, c.name |
| | 94 | ORDER BY month DESC, total_revenue DESC; |
| | 95 | }}} |
| | 96 | |
| | 97 | == Извештај за најпродавани производи == |
| | 98 | |
| | 99 | === Опис === |
| | 100 | |
| | 101 | Погледот ги прикажува најпродаваните производи со вкупна количина и приход. |
| | 102 | |
| | 103 | === Имплементација === |
| | 104 | |
| | 105 | {{{ |
| | 106 | CREATE OR REPLACE VIEW v_top_products AS |
| | 107 | SELECT |
| | 108 | p.product_id, |
| | 109 | p.name AS product_name, |
| | 110 | c.name AS category_name, |
| | 111 | p.price AS current_price, |
| | 112 | COUNT(DISTINCT oi.order_id) AS order_count, |
| | 113 | SUM(oi.quantity) AS total_quantity, |
| | 114 | SUM(oi.quantity * oi.unit_price) AS total_revenue, |
| | 115 | ROUND(AVG(oi.unit_price), 2) AS avg_selling_price |
| | 116 | FROM project.product p |
| | 117 | JOIN project.category c ON c.category_id = p.category_id |
| | 118 | LEFT JOIN project.order_item oi ON oi.product_id = p.product_id |
| | 119 | LEFT JOIN project.orders o ON o.order_id = oi.order_id AND o.status = 'ПЛАТЕНА' |
| | 120 | WHERE p.active = TRUE |
| | 121 | GROUP BY p.product_id, p.name, c.name, p.price |
| | 122 | ORDER BY total_revenue DESC NULLS LAST; |
| | 123 | }}} |
| | 124 | |
| | 125 | == Дневен извештај за продажба == |
| | 126 | |
| | 127 | === Опис === |
| | 128 | |
| | 129 | Погледот прикажува дневен извештај за продажбата со вкупен приход, број на нарачки и просечна вредност. |
| | 130 | |
| | 131 | === Имплементација === |
| | 132 | |
| | 133 | {{{ |
| | 134 | CREATE OR REPLACE VIEW v_daily_sales AS |
| | 135 | SELECT |
| | 136 | DATE(o.created_at) AS sale_date, |
| | 137 | TO_CHAR(o.created_at, 'Day') AS day_of_week, |
| | 138 | COUNT(DISTINCT o.order_id) AS order_count, |
| | 139 | COUNT(DISTINCT o.table_id) AS tables_used, |
| | 140 | COUNT(DISTINCT o.user_id) AS waiters_active, |
| | 141 | SUM(p.amount) AS total_revenue, |
| | 142 | ROUND(AVG(p.amount), 2) AS avg_order_value, |
| | 143 | SUM(CASE WHEN p.method = 'КЕШ' THEN p.amount ELSE 0 END) AS cash_revenue, |
| | 144 | SUM(CASE WHEN p.method = 'КАРТИЧКА' THEN p.amount ELSE 0 END) AS card_revenue |
| | 145 | FROM project.orders o |
| | 146 | JOIN project.payment p ON p.order_id = o.order_id |
| | 147 | WHERE o.status = 'ПЛАТЕНА' |
| | 148 | GROUP BY DATE(o.created_at), TO_CHAR(o.created_at, 'Day') |
| | 149 | ORDER BY sale_date DESC; |
| | 150 | }}} |
| | 151 | |
| | 152 | == Преглед на залиха по производ == |
| | 153 | |
| | 154 | === Опис === |
| | 155 | |
| | 156 | Погледот прикажува моментална залиха за секој производ со статус (ОК, НИСКО, КРИТИЧНО). |
| | 157 | |
| | 158 | === Имплементација === |
| | 159 | |
| | 160 | {{{ |
| | 161 | CREATE OR REPLACE VIEW v_product_stock AS |
| | 162 | SELECT |
| | 163 | p.product_id, |
| | 164 | p.name AS product_name, |
| | 165 | c.name AS category_name, |
| | 166 | p.min_stock, |
| | 167 | COALESCE(SUM(i.quantity_change), 0) AS current_stock, |
| | 168 | CASE |
| | 169 | WHEN COALESCE(SUM(i.quantity_change), 0) <= 0 THEN 'КРИТИЧНО' |
| | 170 | WHEN COALESCE(SUM(i.quantity_change), 0) < p.min_stock THEN 'НИСКО' |
| | 171 | ELSE 'ОК' |
| | 172 | END AS stock_status, |
| | 173 | MAX(i.created_at) AS last_movement |
| | 174 | FROM project.product p |
| | 175 | JOIN project.category c ON c.category_id = p.category_id |
| | 176 | LEFT JOIN project.inventory i ON i.product_id = p.product_id |
| | 177 | WHERE p.active = TRUE |
| | 178 | GROUP BY p.product_id, p.name, c.name, p.min_stock |
| | 179 | ORDER BY stock_status, current_stock ASC; |
| | 180 | }}} |