# Custom Spec & Add To Cart ## Tables **carts** | Name | type | Desc | | -------------------- | ------------- |:---------------------------------------------------- | | user_id | int | index, can be null if anonymous, required if | | status | varchar(255) | draft, checkout, waiting_payment, ordered, completed | | total_price | decimal(15,2) | | | selected_items_count | int | | **cart_items** | Name | Type | Desc | |:--------------- |:------------- |:-------------- | | cart_id | int | index | | variant_page_id | int | index | | title_id | varchar(255) | | | title_en | varchar(255) | | | product_sku_id | int | index | | is_custom_spec | boolean | default: false | | spec_set | jsonb | index | | is_custom_qty | boolean | default: false | | qty | int | | | price | decimal(15,2) | | | price_each | decimal(15,2) | | | final_price | decimal(15,2) | | | margin | decimal(5,2) | | | extra_margin | decimal(5,2) | | | discount | decimal(5,2) | | | artwork_url | varchar(255) | | | notes | text | | | selected | boolean | default: true | **product_sku** | Name | Type | Desc | | ------------------- | ----- | ----- | | .... | .... | .... | | sku_spec_properties | jsonb | index | ## endpoint - Calculate Pricing **`post web/v1/pricings`** ```json= // request { "variant_page_id": 1, "is_custom_spec": true | false, "spec_set": [ { "spec_key_id": 1, // Bahan "spec_key_name": "key_name", "spec_value_id": 2, "spec_value_name": "value_name", }, { "spec_key_id": 1, // Corner "spec_value_id": 2 }, { "spec_key_id": 1, // Size "spec_value_id": NULL, "custom": { "length": 7, "width": 5 } } ], "is_custom_qty": true | false, "custom_qty": 110 // Only if user input custom qty } // Logic - Harus hitung untuk semua quantities + custom_qty - Harus hitung untuk plan user tersebut // Response // -> Lihat price simulation [ { "qty": 1, "prices": [ { "plan": "normal", "price": 10000, "price_each": 1000, "discount": 10.02, "product_sku_id": 1, "save_percentage": 1 } ] } ] ``` - Add to Cart **`post web/v1/carts`** ```json= // request { "variant_page_id": 1, "is_custom_spec": true | false, "spec_set": [ { "spec_key_id": 1, // Bahan "spec_value_id": 2 }, { "spec_key_id": 1, // Corner "spec_value_id": 2 }, { "spec_key_id": 1, // Size "spec_value_id": NULL, "custom": { // optional "length": 7, "width": 5 } } ], "is_custom_qty": true | false, "qty": 110, "artwork_url": "artwork_url" } ``` ```sql= -- Logic -- Find / Create SKU SELECT * FROM product_sku_specs AS spec INNER JOIN product_skus AS sku WHERE sku.product_variant_id = ? AND (spec.spec_key_id = ? AND spec.spec_value_id = ?) AND (spec.spec_key_id = ? AND spec.spec_value_id = ?) SELECT * FROM product_sku_specs AS spec INNER JOIN product_skus AS sku WHERE sku.product_variant_id = ? AND (spec.spec_key_id = ? AND spec.spec_value_id = ?) AND (spec.spec_key_id = ? AND spec.spec_value_id = NULL AND spec.custom = ?) ``` ```jsonb // response { //object cart "cart_id": 1, ... "summary": [ "item_name": "item_name", "final_price": 1000 ] } ``` - get cart **`get /web/v1/carts/:cartId`** ```json= // response { //object cart "cart_id": 1, ... } ``` - update qty **`patch /web/v1/carts/:cartId/cart-items/:cartItemId/quantities`** ```json= // request // include recalculate price, // include update total_price on carts { "qty": 1 } // response { "cart_item_id": 1, "variant_page_quantity_id": 1, "qty": 1, "price": 1000, "price_each": 100, "final_price": 1000, "margin": 1, "extra_margin": 1, "discount": 1, "cart": { "total_price": 1000, } } ``` - update artwork **`patch /web/v1/carts/:cartId/cart-items/:cartItemId/artwprk`** ```json= // request { "artwork_url": "url" } // response { // object cart_item } ``` - delete cart item **`delete /web/v1/carts/:cartId/cart-items/:cartItemId`** ```json= // include recalculate and update total_price on carts // response { // object cart } ```