Purchase Orders List - Code

SQL

spPOHeader_List

USE [PurchaseOrders]
GO

/****** Object:  StoredProcedure [dbo].[spPOHeader_List]  ******/
DROP PROCEDURE [dbo].[spPOHeader_List]
GO

/****** Object:  StoredProcedure [dbo].[spPOHeader_List]   ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--------------  Stored Proc for SELECT 

CREATE PROCEDURE [dbo].[spPOHeader_List]
--No parameters required.
AS
BEGIN
--SQL for Select stored procedure.
SELECT dbo.POHeader.POHeaderID, dbo.POHeader.POHeaderOrderNumber, dbo.POHeader.POHeaderOrderDate, dbo.POHeader.POHeaderSupplierID, dbo.POHeader.POHeaderSupplierAddress1, dbo.POHeader.POHeaderSupplierAddress2, dbo.POHeader.POHeaderSupplierAddress3, 
           dbo.POHeader.POHeaderRequestedBy, dbo.Supplier.SupplierName, SUM(ISNULL((dbo.POLine.POLineProductQuantity * dbo.POLine.POLineProductUnitPrice) * (1 + dbo.POLine.POLineTaxRate), 0)) AS TotalOrderValue
FROM   dbo.POHeader LEFT OUTER JOIN
           dbo.Supplier ON dbo.POHeader.POHeaderSupplierID = dbo.Supplier.SupplierID LEFT OUTER JOIN
           dbo.POLine ON dbo.POHeader.POHeaderID = dbo.POLine.POLineHeaderID
WHERE (dbo.POHeader.POHeaderIsArchived = 0)
GROUP BY dbo.POHeader.POHeaderID, dbo.POHeader.POHeaderOrderNumber, dbo.POHeader.POHeaderOrderDate, dbo.POHeader.POHeaderSupplierID, dbo.POHeader.POHeaderSupplierAddress1, dbo.POHeader.POHeaderSupplierAddress2, dbo.POHeader.POHeaderSupplierAddress3, dbo.POHeader.POHeaderRequestedBy, 
           dbo.Supplier.SupplierName
ORDER BY dbo.POHeader.POHeaderOrderNumber DESC
END

GO

C#

POHeader.cs

using System;
using System.ComponentModel.DataAnnotations;
// This is the model for one row in the database table.
namespace BlazorPurchaseOrders.Data
{
    public class POHeader
    {
        [Required]
        public int POHeaderID { get; set; }

        [Required]
        public int POHeaderOrderNumber { get; set; }

        [Required]
        public DateTime POHeaderOrderDate { get; set; }

        [Required]
        public int POHeaderSupplierID { get; set; }

        [StringLength(50, ErrorMessage = "'Address' has a maximum length of 50 characters.")]
        public string POHeaderSupplierAddress1 { get; set; }

        [StringLength(50, ErrorMessage = "'Address' has a maximum length of 50 characters.")]
        public string POHeaderSupplierAddress2 { get; set; }

        [StringLength(50, ErrorMessage = "'Address' has a maximum length of 50 characters.")]
        public string POHeaderSupplierAddress3 { get; set; }

        [StringLength(10, ErrorMessage = "'Post Code' has a maximum length of 10 characters.")]
        public string POHeaderSupplierPostCode { get; set; }

        [StringLength(256, ErrorMessage = "'Email' has a maximum length of 256 characters.")]
        [EmailAddress(ErrorMessage = "Invalid Email Address format.")]
        public string POHeaderSupplierEmail { get; set; }

        [StringLength(450)]
        public string POHeaderRequestedBy { get; set; }

        [Required]
        public bool POHeaderIsArchived { get; set; }

        public string SupplierName { get; }

        public decimal TotalOrderValue { get; }

    }
}

Index.razor

@page "/"
@using BlazorPurchaseOrders.Data

@inject IPOHeaderService POHeaderService
@inject NavigationManager NavigationManager

<div class="col-sm-12">
    <h3>Purchase Orders</h3>
    <br />
    <SfGrid DataSource="@poheader"
            Toolbar="Toolbaritems">
        <GridEvents OnToolbarClick="ToolbarClickHandler" TValue="POHeader"></GridEvents>
        <GridColumns>
            <GridColumn Field="@nameof(POHeader.POHeaderOrderNumber)"
                        HeaderText="No"
                        TextAlign="@TextAlign.Left"
                        Width="10">
            </GridColumn>
            <GridColumn Field="@nameof(POHeader.POHeaderOrderDate)"
                        HeaderText="Date"
                        Format="d"
                        Type="ColumnType.Date"
                        TextAlign="@TextAlign.Center"
                        Width="15">
            </GridColumn>
            <GridColumn Field="@nameof(POHeader.SupplierName)"
                        HeaderText="Supplier"
                        TextAlign="@TextAlign.Left"
                        Width="40">
            </GridColumn>
            <GridColumn Field="@nameof(POHeader.TotalOrderValue)"
                        HeaderText="Value"
                        TextAlign="@TextAlign.Right"
                        Format="C2"
                        Width="20">
            </GridColumn>
            <GridColumn Field="@nameof(POHeader.POHeaderRequestedBy)"
                        HeaderText="Requested by"
                        TextAlign="@TextAlign.Left"
                        Width="40">
            </GridColumn>
        </GridColumns>
    </SfGrid>

</div>

@code {

    // Create an empty list, named poheader, of empty POHeader objects.
    IEnumerable<POHeader> poheader;

    private List<ItemModel> Toolbaritems = new List<ItemModel>();

    int POHeaderID = 0;

    protected override async Task OnInitializedAsync()
    {
        //Populate the list of countries objects from the Countries table.
        poheader = await POHeaderService.POHeaderList();

        Toolbaritems.Add(new ItemModel() { Text = "Add", TooltipText = "Add a new order", PrefixIcon = "e-add" });
        Toolbaritems.Add(new ItemModel() { Text = "Edit", TooltipText = "Edit selected order", PrefixIcon = "e-edit" });
        Toolbaritems.Add(new ItemModel() { Text = "Delete", TooltipText = "Delete selected order", PrefixIcon = "e-delete" });
    }


    public void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args)
    {
        if (args.Item.Text == "Add")
        {
            //Code for adding goes here
            POHeaderID = 0;
            NavigationManager.NavigateTo($"/purchaseorder/{POHeaderID}");

        }

        if (args.Item.Text == "Edit")
        {
            //Code for editing
        }

        if (args.Item.Text == "Edit")
        {
            //Code for deleting
        }
    }
}