-- Version 0.5.5.1 Removed character length restrictions as the docs for POSTGRESQL recommend not specifying a limit. -- Version 0.6.0.0 Changed the numeric values to integers as Golang doesn't have a native decimal type. -- Version 0.6.2.0 Added the first draft for cost of ownership. Added quantity to the item table. -- Version 0.6.5.0 Added a documents table along with the tables to reference them as either an expense or as a document for an item. DROP TABLE IF EXISTS property_value; DROP TABLE IF EXISTS property; DROP TABLE IF EXISTS property_data_type; DROP TABLE IF EXISTS item_component; DROP TABLE IF EXISTS coo_document; DROP TABLE IF EXISTS item_document; DROP TABLE IF EXISTS document_file; DROP TABLE IF EXISTS coo_line_item; DROP TABLE IF EXISTS cost_of_ownership; DROP TABLE IF EXISTS expense_type; DROP TABLE IF EXISTS item; DROP TABLE IF EXISTS subcategory; DROP TABLE IF EXISTS category; DROP TABLE IF EXISTS document_type; CREATE TABLE property_data_type ( property_data_type_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, property_data_type CHARACTER VARYING UNIQUE NOT NULL ); INSERT INTO property_data_type (property_data_type) VALUES ('Money'); INSERT INTO property_data_type (property_data_type) VALUES ('Text'); INSERT INTO property_data_type (property_data_type) VALUES ('DateTime'); INSERT INTO property_data_type (property_data_type) VALUES ('Number'); CREATE TABLE category ( category_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, category_name CHARACTER VARYING UNIQUE NOT NULL ); CREATE TABLE subcategory ( subcategory_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, subcategory_name CHARACTER VARYING UNIQUE NOT NULL, category_id INT NOT NULL REFERENCES category(category_id) ); CREATE TABLE item ( item_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, item_name CHARACTER VARYING NOT NULL, value_cents INT DEFAULT 0, purchase_cost_cents INT DEFAULT 0, date_aquired TIMESTAMP WITH TIME ZONE, description CHARACTER VARYING, notes CHARACTER VARYING, sold_for_cents INT DEFAULT 0, sold_to CHARACTER VARYING, -- Could be a pointer TO a TABLE OF comtacts. quantity INT DEFAULT 1, category_id INT NOT NULL REFERENCES category(category_id), subcategory_id INT REFERENCES subcategory(subcategory_id) ); -- Example: property_name of "Author" which maps to property_data_type of "Text". CREATE TABLE property ( property_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, property_name CHARACTER VARYING NOT NULL, property_type_id INT NOT NULL REFERENCES property_data_type(property_data_type_id), category_id INT NOT NULL REFERENCES category(category_id), subcategory_id INT REFERENCES subcategory(subcategory_id) ); -- Allows grouping items together, i.e. Alienware Desktop -> CPU, HDDs / SSDs, Motherboard, etc. CREATE TABLE item_component ( item_component_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, item_id INT NOT NULL REFERENCES item(item_id), item_subcomponent_id INT NOT NULL REFERENCES item(item_id) ); CREATE TABLE property_value ( property_value_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, item_id INT NOT NULL REFERENCES item(item_id), property_id INT NOT NULL REFERENCES property(property_id), value CHARACTER VARYING NOT NULL ); CREATE TABLE cost_of_ownership ( coo_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, coo_description CHARACTER VARYING, coo_display_text CHARACTER VARYING NOT NULL, -- I.E. "Transmission Rebuild" etc. coo_service_rendered_date TIMESTAMP WITH TIME ZONE --service BIT Like was this a service or did you buy a replacement and do it yourself? --coo type eg 'Regular Maintence' etc ); -- An item or items associated with the cost of ownership, i.e. a replacement motor. --CREATE TABLE coo_item ( -- coo_item_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, -- item_id INT NOT NULL REFERENCES item(item_id), -- coo_id INT NOT NULL REFERENCES cost_of_ownership(coo_id), -- --) CREATE TABLE expense_type ( expense_type_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, expense_type_name CHARACTER VARYING UNIQUE NOT NULL --LIKE "Sales Tax" OR "Labour" ); INSERT INTO expense_type (expense_type_name) VALUES ('Sales Tax'); INSERT INTO expense_type (expense_type_name) VALUES ('Labour'); INSERT INTO expense_type (expense_type_name) VALUES ('Grand Total'); -- An itemized expense, like cost of labour, or cost of parts for whoever is doing the repairs / replacement, taxes etc.. CREATE TABLE coo_line_item ( coo_line_item_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, cost_cents INT DEFAULT 0, expense_type_id INT NOT NULL REFERENCES expense_type(expense_type_id), coo_id INT NOT NULL REFERENCES cost_of_ownership(coo_id), item_id INT REFERENCES item(item_id) ); CREATE TABLE document_type ( document_type_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, document_type_name CHARACTER VARYING UNIQUE NOT NULL ); INSERT INTO document_type (document_type_name) VALUES ('Certificate of Authenticity'); INSERT INTO document_type (document_type_name) VALUES ('Sales Contract'); INSERT INTO document_type (document_type_name) VALUES ('Invoice'); INSERT INTO document_type (document_type_name) VALUES ('Title'); INSERT INTO document_type (document_type_name) VALUES ('Deed'); INSERT INTO document_type (document_type_name) VALUES ('Receipt'); CREATE TABLE document_file ( document_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, original_filename CHARACTER VARYING NOT NULL, display_name CHARACTER VARYING NOT NULL, mime_type CHARACTER VARYING NOT NULL, file_extension CHARACTER VARYING NOT NULL, document_type_id INT NOT NULL REFERENCES document_type(document_type_id) ); CREATE TABLE item_document ( item_document_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, item_id INT NOT NULL REFERENCES item(item_id), document_file_id INT NOT NULL REFERENCES document_file(document_id) ); CREATE TABLE coo_document ( coo_document_id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, coo_id INT NOT NULL REFERENCES cost_of_ownership(coo_id), document_file_id INT NOT NULL REFERENCES document_file(document_id) ); INSERT INTO category (category_name) VALUES ('Books'); INSERT INTO category (category_name) VALUES ('Electronics'); INSERT INTO category (category_name) VALUES ('Appliances'); INSERT INTO category (category_name) VALUES ('Kitchenware'); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('PCIe Cards', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Laptops', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Desktops', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('CPUs', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Hard Drives', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Switches', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Routers', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('CPU Coolers', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('USB Devices', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Oscilloscopes', 2); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Heaters', 3); INSERT INTO subcategory(subcategory_name, category_id) VALUES ('Eletric Kettles', 4);