-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInvoiceGenerationSystem.sql
More file actions
95 lines (76 loc) · 2.29 KB
/
InvoiceGenerationSystem.sql
File metadata and controls
95 lines (76 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
USE AdventureWorks;
GO
IF OBJECT_ID('igs.GenerateInvoice', 'P') IS NOT NULL
DROP PROCEDURE igs.GenerateInvoice;
GO
IF OBJECT_ID('igs.InvoiceLine', 'U') IS NOT NULL
DROP TABLE igs.InvoiceLine;
GO
IF OBJECT_ID('igs.Invoice', 'U') IS NOT NULL
DROP TABLE igs.Invoice;
GO
IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'igs')
DROP SCHEMA igs;
GO
CREATE SCHEMA igs;
GO
CREATE TABLE igs.Invoice (
InvoiceID INT IDENTITY PRIMARY KEY,
SalesOrderID INT NOT NULL,
CustomerID INT NOT NULL,
InvoiceDate DATETIME DEFAULT GETDATE(),
TotalAmount MONEY,
CreatedAt DATETIME DEFAULT GETDATE()
);
GO
CREATE TABLE igs.InvoiceLine (
InvoiceLineID INT IDENTITY PRIMARY KEY,
InvoiceID INT FOREIGN KEY REFERENCES igs.Invoice(InvoiceID),
ProductID INT,
Quantity INT,
UnitPrice MONEY,
LineTotal MONEY
);
GO
CREATE OR ALTER PROCEDURE igs.GenerateInvoice
@SalesOrderID INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @CustomerID INT;
DECLARE @InvoiceID INT;
DECLARE @TotalAmount MONEY;
BEGIN TRY
BEGIN TRANSACTION;
SELECT @CustomerID = soh.CustomerID
FROM Sales.SalesOrderHeader soh
WHERE soh.SalesOrderID = @SalesOrderID;
IF @CustomerID IS NULL
BEGIN
THROW 50001, 'Sales Order with the specified ID does not exist.', 1;
END
SELECT @TotalAmount = SUM(UnitPrice * OrderQty)
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = @SalesOrderID;
INSERT INTO igs.Invoice (SalesOrderID, CustomerID, TotalAmount)
VALUES (@SalesOrderID, @CustomerID, @TotalAmount);
SET @InvoiceID = SCOPE_IDENTITY();
INSERT INTO igs.InvoiceLine (InvoiceID, ProductID, Quantity, UnitPrice, LineTotal)
SELECT
@InvoiceID,
ProductID,
OrderQty,
UnitPrice,
UnitPrice * OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = @SalesOrderID;
COMMIT TRANSACTION;
PRINT 'Invoice generated successfully. Invoice ID: ' + CAST(@InvoiceID AS VARCHAR);
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage NVARCHAR(255)='An error occurred while generating the invoice: ' + CAST(ERROR_NUMBER() AS NVARCHAR);
THROW 50010, @ErrorMessage, 1;
END CATCH
END;
GO