| 328 | | |
| | 328 | == Купување на производи |
| | 329 | |
| | 330 | Оваа функционалност овозможува корисникот да ја претвори содржината на кошничката во нарачка. |
| | 331 | |
| | 332 | |
| | 333 | = Функција fn_reduce_product_stock |
| | 334 | |
| | 335 | Ја намалува количината на залиха на продукт по успешно купување. |
| | 336 | |
| | 337 | |
| | 338 | {{{ |
| | 339 | CREATE OR REPLACE FUNCTION fn_reduce_product_stock( |
| | 340 | p_product_id INT, |
| | 341 | p_quantity INT |
| | 342 | ) |
| | 343 | RETURNS VOID |
| | 344 | LANGUAGE plpgsql |
| | 345 | AS $$ |
| | 346 | BEGIN |
| | 347 | |
| | 348 | UPDATE product |
| | 349 | SET quantity = quantity - p_quantity |
| | 350 | WHERE product_id = p_product_id; |
| | 351 | --ako e 0 da go deaktivira |
| | 352 | |
| | 353 | END; |
| | 354 | $$; |
| | 355 | }}} |
| | 356 | |
| | 357 | |
| | 358 | |
| | 359 | = Процедура buy_from_cart |
| | 360 | |
| | 361 | Го реализира процесот на купување на сите производи кои се наоѓаат во кошничката на корисникот. |
| | 362 | |
| | 363 | * Намалување на залиха - за секој производ во кошничката се повикува: fn_reduce_product_stock(...) |
| | 364 | * Креирање на нарачка - во табелата Order се внесува нов запис |
| | 365 | * Креирање на ставки на нарачка - сите производи од кошничката(CartItems) се префрлаат во табелата OrderItems. |
| | 366 | * Ажурирање на статистика - во табелата ProductStats се зголемува полето: sells_count |
| | 367 | * Евидентирање на плаќање - се креира запис во табелата Payment |
| | 368 | * Креирање трансакции |
| | 369 | * За секој продавач кој има продадени производи во нарачката се креира запис во табелата Transactions. |
| | 370 | * Reset на кошничка |
| | 371 | |
| | 372 | |
| | 373 | {{{ |
| | 374 | CREATE OR REPLACE PROCEDURE buy_from_cart( |
| | 375 | p_buyer_id INT, |
| | 376 | p_payment_method VARCHAR, |
| | 377 | OUT p_order_id INT, |
| | 378 | OUT p_payment_id INT |
| | 379 | ) |
| | 380 | LANGUAGE plpgsql |
| | 381 | AS $$ |
| | 382 | DECLARE |
| | 383 | v_cart_id INT; |
| | 384 | v_total DECIMAL(10,2); |
| | 385 | v_item_count INT; |
| | 386 | v_updated_rows INT; |
| | 387 | BEGIN |
| | 388 | -- Najdi kosnicka |
| | 389 | SELECT cart_id INTO v_cart_id |
| | 390 | FROM cart |
| | 391 | WHERE user_id = p_buyer_id; |
| | 392 | |
| | 393 | IF NOT FOUND THEN |
| | 394 | RAISE EXCEPTION 'Kosnickata ne postoi'; |
| | 395 | END IF; |
| | 396 | |
| | 397 | -- Dali ima stavki? |
| | 398 | SELECT COUNT(*) INTO v_item_count |
| | 399 | FROM cartitems |
| | 400 | WHERE cart_id = v_cart_id; |
| | 401 | |
| | 402 | IF v_item_count = 0 THEN |
| | 403 | RAISE EXCEPTION 'Kosnickata e prazna'; |
| | 404 | END IF; |
| | 405 | |
| | 406 | --ja prezemame total price |
| | 407 | select total_price INTO v_total |
| | 408 | from cart c |
| | 409 | where c.cart_id = v_cart_id; |
| | 410 | |
| | 411 | |
| | 412 | -- Proverka na zaliha |
| | 413 | -- PERFORM fn_validate_product_stock( |
| | 414 | -- ci.product_id, |
| | 415 | -- ci.quantity |
| | 416 | -- ) |
| | 417 | -- FROM cartitems ci |
| | 418 | -- WHERE ci.cart_id = v_cart_id; |
| | 419 | |
| | 420 | --1. Chim ima na zaliha namali na kolichina |
| | 421 | PERFORM fn_reduce_product_stock( |
| | 422 | ci.product_id, |
| | 423 | ci.quantity |
| | 424 | ) |
| | 425 | FROM cartitems ci |
| | 426 | WHERE ci.cart_id = v_cart_id; |
| | 427 | |
| | 428 | |
| | 429 | |
| | 430 | |
| | 431 | -- 2. Kreiraj narachka |
| | 432 | INSERT INTO "Order" (buyer_id, cart_id, total_price, status, created_at) |
| | 433 | VALUES (p_buyer_id, v_cart_id, v_total, 'CONFIRMED', CURRENT_TIMESTAMP) |
| | 434 | RETURNING order_id INTO p_order_id; |
| | 435 | |
| | 436 | -- 3. Prefrli stavki vo OrderItems |
| | 437 | INSERT INTO orderitems (order_id, product_id, seller_id, price_at_time, quantity) |
| | 438 | SELECT |
| | 439 | p_order_id, |
| | 440 | ci.product_id, |
| | 441 | p.seller_id, |
| | 442 | ci.price_at_time, |
| | 443 | ci.quantity |
| | 444 | FROM cartitems ci |
| | 445 | JOIN product p ON p.product_id = ci.product_id |
| | 446 | WHERE ci.cart_id = v_cart_id; |
| | 447 | |
| | 448 | |
| | 449 | -- 4. Azuriraj sells_count |
| | 450 | UPDATE productstats ps |
| | 451 | SET sells_count = ps.sells_count + ci.quantity |
| | 452 | FROM cartitems ci |
| | 453 | WHERE ci.cart_id = v_cart_id |
| | 454 | AND ps.product_id = ci.product_id; |
| | 455 | |
| | 456 | -- 5. Plakjanje |
| | 457 | INSERT INTO payment (user_id, order_id, package_id, amount, payment_method, transaction_date) |
| | 458 | VALUES (p_buyer_id, p_order_id, NULL, v_total, p_payment_method, CURRENT_DATE) |
| | 459 | RETURNING payment_id INTO p_payment_id; |
| | 460 | |
| | 461 | -- 6. Transactions po prodavach |
| | 462 | INSERT INTO transactions (payment_id, seller_id, amount, status, transaction_date) |
| | 463 | SELECT |
| | 464 | p_payment_id, |
| | 465 | oi.seller_id, |
| | 466 | SUM(oi.price_at_time * oi.quantity), |
| | 467 | 'COMPLETED', |
| | 468 | CURRENT_DATE |
| | 469 | FROM orderitems oi |
| | 470 | WHERE oi.order_id = p_order_id |
| | 471 | GROUP BY oi.seller_id; |
| | 472 | |
| | 473 | -- 7. Isprazni kosnicka |
| | 474 | DELETE FROM cartitems |
| | 475 | WHERE cart_id = v_cart_id; |
| | 476 | |
| | 477 | UPDATE cart |
| | 478 | SET total_price = fn_calc_cart_total(p_cart_id) |
| | 479 | WHERE cart_id = v_cart_id; |
| | 480 | |
| | 481 | END; |
| | 482 | $$; |
| | 483 | }}} |