Index: .idea/sqldialects.xml
===================================================================
--- .idea/sqldialects.xml	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ .idea/sqldialects.xml	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
@@ -2,4 +2,5 @@
 <project version="4">
   <component name="SqlDialectMappings">
+    <file url="file://$PROJECT_DIR$/music/procedures/insert_track_with_price.sql" dialect="PostgreSQL" />
     <file url="file://$PROJECT_DIR$/music/triggers/customer_deletion.sql" dialect="PostgreSQL" />
     <file url="file://$PROJECT_DIR$/music/triggers/media_type_deletion.sql" dialect="PostgreSQL" />
Index: music/procedures/insert_track_with_price.sql
===================================================================
--- music/procedures/insert_track_with_price.sql	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
+++ music/procedures/insert_track_with_price.sql	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
@@ -0,0 +1,35 @@
+CREATE OR REPLACE PROCEDURE insert_track_with_price(
+    p_name VARCHAR,
+    p_album_id INT,
+    p_media_type_id INT,
+    p_genre_id INT,
+    p_composer VARCHAR,
+    p_milliseconds INT,
+    p_bytes INT,
+    p_price NUMERIC(10,2)
+)
+LANGUAGE plpgsql
+AS $$
+DECLARE
+    new_track_id INT;
+BEGIN
+    INSERT INTO track (
+        name, album_id, media_type_id, genre_id, composer, milliseconds, bytes
+    )
+    VALUES (
+        p_name, p_album_id, p_media_type_id, p_genre_id, p_composer, p_milliseconds, p_bytes
+    )
+    RETURNING track_id INTO new_track_id;
+
+    INSERT INTO price (
+        track_id, value, date
+    )
+    VALUES (
+        new_track_id, p_price, NOW()
+    );
+END;
+$$;
+
+GRANT EXECUTE ON PROCEDURE insert_track_with_price(
+    VARCHAR, INT, INT, INT, VARCHAR, INT, INT, NUMERIC
+) TO PUBLIC;
Index: sic/triggers/insert_price_on_track_insert.sql
===================================================================
--- music/triggers/insert_price_on_track_insert.sql	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ 	(revision )
@@ -1,14 +1,0 @@
-CREATE OR REPLACE FUNCTION insert_price_on_track_insert()
-RETURNS TRIGGER AS $$
-BEGIN
-  INSERT INTO price (value, date, track_id)
-  VALUES (NEW.unit_price, NOW(), NEW.track_id);
-
-  RETURN NEW;
-END;
-$$ LANGUAGE plpgsql;
-
-CREATE TRIGGER insert_price_on_track_insert
-AFTER INSERT ON track
-FOR EACH ROW
-EXECUTE FUNCTION insert_price_on_track_insert();
Index: sic/triggers/insert_price_on_track_update.sql
===================================================================
--- music/triggers/insert_price_on_track_update.sql	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ 	(revision )
@@ -1,16 +1,0 @@
-CREATE OR REPLACE FUNCTION insert_price_on_track_update()
-RETURNS TRIGGER AS
-$$
-BEGIN
-    INSERT INTO price (value, date, track_id)
-    VALUES (NEW.unit_price, NOW(), NEW.track_id);
-
-    RETURN NEW;
-END;
-$$ LANGUAGE plpgsql;
-
-CREATE TRIGGER insert_price_on_track_update
-    AFTER UPDATE
-    ON track
-    FOR EACH ROW
-EXECUTE FUNCTION insert_price_on_track_update();
Index: music/triggers/update_invoice_total_after_delete.sql
===================================================================
--- music/triggers/update_invoice_total_after_delete.sql	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ music/triggers/update_invoice_total_after_delete.sql	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
@@ -4,7 +4,13 @@
     UPDATE invoice
     SET total = (
-        SELECT COALESCE(SUM(unit_price * quantity), 0)
-        FROM invoice_line
-        WHERE invoice_id = OLD.invoice_id
+        SELECT COALESCE(SUM(il.quantity * lp.value), 0)
+        FROM invoice_line il
+        JOIN (
+            SELECT DISTINCT ON (track_id)
+                track_id, value
+            FROM price
+            ORDER BY track_id, date DESC
+        ) lp ON il.track_id = lp.track_id
+        WHERE il.invoice_id = OLD.invoice_id
     )
     WHERE invoice_id = OLD.invoice_id;
@@ -13,7 +19,2 @@
 END;
 $$ LANGUAGE plpgsql;
-
-CREATE TRIGGER trg_update_invoice_total_after_delete
-AFTER DELETE ON invoice_line
-FOR EACH ROW
-EXECUTE FUNCTION update_invoice_total_after_delete();
Index: music/triggers/update_invoice_total_after_insert.sql
===================================================================
--- music/triggers/update_invoice_total_after_insert.sql	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ music/triggers/update_invoice_total_after_insert.sql	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
@@ -4,7 +4,13 @@
     UPDATE invoice
     SET total = (
-        SELECT COALESCE(SUM(unit_price * quantity), 0)
-        FROM invoice_line
-        WHERE invoice_id = NEW.invoice_id
+        SELECT COALESCE(SUM(il.quantity * lp.value), 0)
+        FROM invoice_line il
+        JOIN (
+            SELECT DISTINCT ON (track_id)
+                track_id, value
+            FROM price
+            ORDER BY track_id, date DESC
+        ) lp ON il.track_id = lp.track_id
+        WHERE il.invoice_id = NEW.invoice_id
     )
     WHERE invoice_id = NEW.invoice_id;
@@ -13,7 +19,2 @@
 END;
 $$ LANGUAGE plpgsql;
-
-CREATE TRIGGER trg_update_invoice_total_after_insert
-AFTER INSERT ON invoice_line
-FOR EACH ROW
-EXECUTE FUNCTION update_invoice_total_after_insert();
Index: music/views/avg_price_per_artist.sql
===================================================================
--- music/views/avg_price_per_artist.sql	(revision 75ea229d549bcf10342f483dbb27e69334411131)
+++ music/views/avg_price_per_artist.sql	(revision 4299936e23147060b2027ace52e960d67b3dd20b)
@@ -1,8 +1,17 @@
 CREATE VIEW avg_price_per_artist AS
+WITH latest_price AS (
+    SELECT DISTINCT ON (track_id)
+        track_id,
+        value
+    FROM price
+    ORDER BY track_id, date DESC
+)
 SELECT
     ar.name,
-    COALESCE( ROUND(avg(t.unit_price), 2)::text, 'not enogu data') as avg_price_per_track
+    COALESCE(ROUND(AVG(lp.value), 2)::text, 'not enough data') AS avg_price_per_track
 FROM artist ar
-left join album a on ar.artist_id = a.artist_id
-left join track t on a.album_id = t.album_id
-group by ar.name
+LEFT JOIN album a ON ar.artist_id = a.artist_id
+LEFT JOIN track t ON a.album_id = t.album_id
+LEFT JOIN latest_price lp ON t.track_id = lp.track_id
+GROUP BY ar.name
+ORDER BY ar.name;
