Computerised Billing System

//----------------------------------------------------------------------------
//  Header Files Included
//----------------------------------------------------------------------------
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<fstream.h>
#include<ctype.h>
#include<graphics.h>
#include<conio.h>
//Function prototype declaration
void products_enter();
void members_enter();
void readp();
void readm();
void billing();
void sales();
void modifyp();
void modifym();
void instructions();
//----------------------------------------------------------------------------
// Function for GRAPHICS slide (cover page)
//----------------------------------------------------------------------------
int gmode,gdriver,r;
//----------------------------------------------------------------------------
// Structure for the products' records
//----------------------------------------------------------------------------

struct products_record
{
    float rate;
    int stock;
    int no;
    char name[20];
}; //end of structure
//Global variable
products_record ob1,ob2;  //declaring objects of the structure
fstream pro1,pro2;  //declaring a file stream
//----------------------------------------------------------------------------
// Structure for members' records
//----------------------------------------------------------------------------

struct members_record
{
    int no;
    char name[20];
    char add[50];
    long int tel;
    long int card;
    float amt ;
}; //end of structure
members_record m1,m2;  //creating objects
fstream mem1,mem2;     //declaring streams;


//----------------------------------------------------------------------------
//structure for store opertaions
//----------------------------------------------------------------------------

struct tables
{
    int no;
    int qty;
    char name[20];
    float rate;
    float total;
};

tables n1,n2;
int i=0;
float discount=0.0;

//Welcome screen of computerized billing system
void welcome()
{
    gdriver=DETECT;       //request auto detection
    initgraph(&gdriver,&gmode,"c:\\turboc3\\bgi");  //initialising graph
    /* read result of initialization */
    int errorcode = graphresult();
    if (errorcode != grOk)  /* an error occurred */
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        return;
    }
    setbkcolor(7);
    setcolor(15);
    settextstyle(SANS_SERIF_FONT,HORIZ_DIR,5);
    settextstyle(7,HORIZ_DIR,7);
    moveto(60,100);
    outtext("COMPUTERISED");
    moveto(160,210);
    outtext("BILLING ");
    moveto(160,320);
    outtext("SYSTEM");
    delay(1000);
    setcolor(7);
    int i=0;
    while(i<=2*getmaxx()-460)
    {
        line(0,i,i,0);
        i++;
        delay(15);
    }
    setcolor(RED);
    sound(1450);
    delay(20);
    sound(600);
    for (r=150;r<230;r+=15)
    {
        circle (315,239,r);
        sound(350+2*r);
        delay(19);
        sound(1250);
    }
    settextstyle(8,HORIZ_DIR,1);
    setcolor(LIGHTGREEN);
    sound(500);
    delay(5);
    moveto(245,160);
    outtext("Copyright (C)");
    sound(400);
    delay(23);
    moveto(185,180);
    sound(350);
    delay(50);
    sound(100);
    outtext("Reeta Sahoo");
    moveto(240,200);
    sound(250);
    delay(40);
    outtext("20006-2007 ");
    moveto(210,220);
    outtext("All Rights Reserved");
    sound(400);
    moveto(185,240);
    outtext("Code by: Reeta Sahoo");
    sound(450);
    moveto(185,260);
    delay(20);
    sound(600);
    delay(30);
    outtext("Email: gbsahoo@yahoo.com");
    nosound();
    moveto(10,450);
    cin.get();
    closegraph();  //closing graphics screen
}

//----------------------------------------------------------------------------
// Function for screen setting
//----------------------------------------------------------------------------
void border()
{
    clrscr();
    textcolor(WHITE);
    for (int i=2;i<80;i++)     //drawing horizontal lines
    {
        gotoxy(i,3);
        cprintf("-");
        gotoxy(i,23);
        cprintf("-");
    }
    for (i=4;i<23;i++)         //drawing vertical lines
    {
        gotoxy(2,i);
        cprintf("|");
        gotoxy(79,i);
        cprintf("|");
    }
}

//----------------------------------------------------------------------------
// Main program
//----------------------------------------------------------------------------

void main()
{
    clrscr();
    void highvideo();   //setting the intensity of text charaters to high
    welcome();          // calling the function for making the cover page
    remove("sale.dat");
    int n;
    char l='y';
    do
    {
        textcolor(LIGHTGREEN);
        border();       //making the border of the screen
        textcolor(LIGHTGREEN);
        gotoxy(30,5);
        cprintf("MAIN MENU");
        for (int z=29;z<=40;z++)
        {
            gotoxy(z,6);
            cprintf("-");
        }
        gotoxy(20,7);
        cprintf("1:ADD NEW PRODUCTS");
        gotoxy(20,8);
        cprintf("2:ADD NEW MEMBERS");
        gotoxy(20,9);
        cprintf("3:VIEW AN EXISTING PRODUCT RECORD ");
        gotoxy(20,10);
        cprintf("4:VIEW AN EXISTING MEMBER'S RECORD ");
        gotoxy(20,11);
        cprintf("5:BILLING ");
        gotoxy(20,12);
        cprintf("6:TODAY'S SALES ");
        gotoxy(20,13);
        cprintf("7:MODIFY PRODUCT RECORD ");
        gotoxy(20,14);
        cprintf("8:MODIFY MEMBER'S RECORD ");
        gotoxy(20,15);
        cprintf("9:INSTRUCTIONS ");
        gotoxy(20,16);
        cprintf("0:EXIT");
        gotoxy(20,19);
        cprintf("Enter your choice:");
        cin>>n;
        switch(n)
        {
            case 1:    products_enter();
                break;
            case 2:    members_enter();
                break;
            case 3:    readp();
                break;
            case 4:    readm();
                break;
            case 5:    billing();
                break;
            case 6:    sales();
                break;
            case 7:    modifyp();
                break;
            case 8:    modifym();
                break;
            case 9:    instructions();
                break;
            case 0:    l='n';
        }
    } while (l=='y');
    clrscr();
}

//----------------------------------------------------------------------------
// Function for getting the products' records
//----------------------------------------------------------------------------
void products_enter()
{
    int q=0;
    char l='y';
    pro1.open("products.dat",ios::in);  //opening file in stream
    pro1.seekg(0,ios::end);  //determining end of file
    q=pro1.tellg()/sizeof(products_record);  //finding size of file
    q+=1255;
    pro1.close();
    pro1.open("products.dat" ,ios::app);

    do
    {
        textcolor(LIGHTBLUE);
        clrscr();
        border();
        textcolor(LIGHTBLUE);
        gotoxy(28,2);
        cprintf("ENTERING PRODUCT RECORDS ");
        gotoxy(15,6);
        cprintf("Name :");
        gets(ob1.name);
        if (!ob1.name[0])           //to undo entering if name is not entered
            return;
        gotoxy(15,7);
        cprintf("Stock :");
        cin>>ob1.stock;
        gotoxy(15,8);
        cprintf("Rate (Rs.):");
        cin>>ob1.rate;
        ob1.no = q++;
        gotoxy(15,9);
        cprintf("Number :");
        cout<<ob1.no;
        pro1.write((char*)&ob1,sizeof(products_record));
        gotoxy(10,15);
        cprintf("Do you want to enter more (Y/N) ");
        l=getch();
    } while (tolower(l)=='y');
    pro1.close();
}

//--------------------------------------------------------------
//Function for searching in the file
//--------------------------------------------------------------
products_record products_search(int no)
{
    fstream pro1; //declaring stream
    pro1.open("products.dat" ,ios::in||ios::nocreate); //opening the file
    while(pro1)
    {
        pro1.read((char*)&ob1,sizeof(products_record));
        //reading from file
        if (ob1.no==no)
            return ob1;   //returning the searched record
    }
    pro1.close();
    ob1.no=0;
    return ob1;
}

//----------------------------------------------------------------------------
//Function for modifying records
//----------------------------------------------------------------------------
void products_modify(int no)
{
    ob2.no=0;
    pro1.open("products.dat",ios::in);  //opening the file
    pro2.open("product1.dat",ios::app); //opening another file
    pro1.seekg(0,ios::beg);    //locating beggining of file
    pro1.read((char*)&ob1,sizeof(products_record));
    //reading from file
    while (!pro1.eof() )      //testing for end of file
    {
        if (ob1.no!=no )
            pro2.write((char*)&ob1,sizeof(products_record));
            //writing in file
        else
            ob2=ob1;
        pro1.read((char*)&ob1,sizeof(products_record));
        //reading from file
    }
    //displaying previous reccords and entering new records
    if (ob2.no)
    {
        gotoxy(13,7);
        cprintf("CURRENT RECORDS ARE ");
        gotoxy(15,8);
        cprintf("NAME :");
        puts(ob2.name);
        gotoxy(15,9);
        cprintf("RATE :(Rs.)");
        cout<<ob2.rate;
        gotoxy(15,10);
        cprintf("STOCK :");
        cprintf("%d",ob2.stock);
        gotoxy(13,12);
        cprintf("ENTER NEW PRODUCT RECORDS");
        gotoxy(15,13);
        cprintf("NAME :");
        ob1.no=ob2.no;
        gets(ob1.name);
        if (!isalnum(ob1.name[0]))    //testing for an entry
            strcpy(ob1.name,ob2.name);   //retaining previous name when no entry
        gotoxy(15,14);
        cprintf("RATE :(Rs.)");
        cin>>ob1.rate;
        if (!ob1.rate)
             ob1.rate=ob2.rate;
        gotoxy(15,15);
        cprintf("STOCK :");
        cin>>ob1.stock;
        if (!ob1.stock)
            ob1.stock=ob2.stock;
        pro2.write((char*)&ob1,sizeof(products_record)); //writing in file
    }
    else
    {
        gotoxy(20,9);
        cprintf("NO ENTRY\a");
    }
    pro1.close(); //closing file
    pro2.close(); //closing file
    remove ("products.dat");     //deleting file
    rename ("product1.dat","products.dat");     //renaming file
}

//----------------------------------------------------------------------------
// Function to enter members' records
//----------------------------------------------------------------------------
void members_enter()
{
    int m;
    char l='y';
    //determining number of enteries in the file
    mem1.open("members.dat",ios::in);
    mem1.seekg(0,ios::end);
    m=mem1.tellg()/sizeof(members_record);
    mem1.close();
    m+=10;
    clrscr();
    mem1.open("members.dat",ios::app);        //opening file
    do
    {
        textcolor(LIGHTCYAN);
        clrscr();
        border();
        textcolor(LIGHTCYAN);
        gotoxy(28,2);
        cprintf("ENTERING MEMBER RECORDS ");
        gotoxy(15,6);
        cprintf("Name :");
        gets(m1.name);
        if (!m1.name[0])
            return; //undo entering when no name is entered
        gotoxy(15,7);
        cprintf("Card number :");
        cin>>m1.card;
        gotoxy(15,8);
        cprintf("Address :");
        gets(m1.add);
        gotoxy(15,9);
        cprintf("Tel. :");
        cin>>m1.tel;
        gotoxy(15,10);
        cprintf("Amount Deposited (Rs.):");
        cin>>m1.amt;
        if (m1.amt<=100)
        {
            gotoxy(15,11);
            cprintf("Amount less\a");
            gotoxy(15,12);
            cprintf("Try Again");
            goto end;
        }
        m1.no = m++;
        gotoxy(15,11);
        cprintf("Membership number :");
        cout<<m1.no;
        mem1.write((char*)&m1,sizeof(members_record));   //writing in file
        end:
        gotoxy(10,15);
        cprintf("Do you want to enter more (Y/N) ");
        l=getch();
    } while (tolower(l)=='y');
    mem1.close();
}

//----------------------------------------------------------------------------
// Function for searching in the file
//----------------------------------------------------------------------------
members_record members_search(int no)
{
    fstream mem2; //declaring stream
    mem2.open("members.dat",ios::in);       //opening file
    while (mem2)
    {
        mem2.read((char*)&m1,sizeof(members_record));   //reading from file
        if (m1.no==no)
            return m1;  //returning the searched record
    }
    mem2.close();
    m1.no=0;
    return m1;
}

//----------------------------------------------------------------------------
// Function to modify members' records
//----------------------------------------------------------------------------
void members_modify(int no)
{
    m2.no=0;
    mem1.open("members.dat",ios::in);        //opening a file
    mem2.open("member1.dat",ios::app);       //opening another file
    mem1.seekg(0,ios::beg);
    mem1.read((char*)&m1,sizeof(members_record));
    while (!mem1.eof())                     //testing for end of file
    {
        if (m1.no!=no)
            mem2.write((char*)&m1,sizeof(members_record));
        else
            m2=m1;
        mem1.read((char*)&m1,sizeof(members_record));
    }
    //displaying current records and entering new records
    if (m2.no)
    {
        gotoxy(13,7);
        cprintf("CURRENT RECORDS ARE ");
        gotoxy(15,8);
        cprintf("NAME :");
        puts(m2.name);
        gotoxy(15,9);
        cprintf("CARD NUMBER :");
        cout<<m2.card;
        gotoxy(15,10);
        cprintf("ADDRESS :");
        puts(m2.add);
        gotoxy(15,11);
        cprintf("TELEPHONE :");
        cout<<m2.tel;
        gotoxy(15,12);
        cprintf("AMOUNT :(Rs.)");
        cout<<m2.amt;
        gotoxy(13,14);
        cprintf("ENTER NEW RECORDS");
        gotoxy(15,15);
        cprintf("NAME :");
        m1.no=m2.no;
        gets(m1.name);
        if (!m1.name[0])
            strcpy(m1.name,m2.name);
        gotoxy(15,16);
        cprintf("ADDRESS :");
        gets(m1.add);
        if (!m1.add[0])
            strcpy(m1.add,m2.add);
        gotoxy(15,17);
        cprintf("CARD NUMBER :");
        cin>>m1.card;
        if (!m1.card)
            m1.card=m2.card;
        gotoxy(15,18);
        cprintf("TELEPHONE :");
        cin>>m1.tel;
        if (!m1.tel)
            m1.tel=m2.tel;
        gotoxy(15,19);
        cprintf("AMOUNT ADDED :(Rs.)");
        cin>>m1.amt;
        m1.amt+=m2.amt;
        mem2.write((char*)&m1,sizeof(members_record));
    }
    else
    {
        gotoxy(20,10);
        cprintf("NO ENTRY\a");
    }
    mem1.close();       //closing file
    mem2.close();       //closing file
    remove ("members.dat");        //removing file
    rename ("member1.dat","members.dat");        //renaming file
}

//----------------------------------------------------------------------------
// Function for reading product records
//----------------------------------------------------------------------------
void readp()
{
    char l='y';
    do
    {
        textcolor(LIGHTBLUE);
        clrscr();
        border();
        textcolor(LIGHTBLUE);
        gotoxy(28,2);
        cprintf("VIEWING PRODUCT RECORDS ");
        gotoxy(15,6);
        cprintf("Enter product number:");
        int no;
        cin>>no;
        ob1=products_search(no);           //calling for search in the file
        // displaying records
        if (ob1.no)
        {
            gotoxy(18,9);
            cprintf("The record is");
            gotoxy(20,10);
            cprintf(" Number :");
            cout<<ob1.no;
            gotoxy(20,11);
            cprintf(" Stock :");
            cout<<ob1.stock;
            gotoxy(20,12);
            cprintf(" Name : ");
            puts(ob1.name);
            gotoxy(20,13);
            cprintf(" Rate :(Rs.)");
            cout<<ob1.rate;
        }
        else
        {
            gotoxy(20,10);
            cprintf("NO ENTRY \a");
        }
        gotoxy(15,16);
        cprintf("Any more records desired (Y/N)");
        l=getch();
    } while(tolower(l)=='y');
}

//----------------------------------------------------------------------------
// Function to pruduce screen for 'modify product records'
//----------------------------------------------------------------------------
void modifyp()
{
    char l='y';
    do
    {
        textcolor(LIGHTBLUE);
        clrscr();
        border();
        textcolor(LIGHTBLUE);
        gotoxy(25,2);
        cprintf("MODIFYING A PRODUCT RECORD");
        gotoxy(15,5);
        cprintf("Enter the product number:");
        int no;
        cin>>no;
        products_modify(no);         //calling for modifications
        gotoxy(13,20);
        cprintf("Any more modifications desired(Y/N)");
        l=getch();
    } while (tolower(l)=='y');
}

//----------------------------------------------------------------------------
// Function to read members' records
//----------------------------------------------------------------------------
void readm()
{
    char l='y';
    do
    {
        textcolor(LIGHTCYAN);
        clrscr();
        border();
        textcolor(LIGHTCYAN);
        gotoxy(25,2);
        cprintf("VIEWING A MEMBER'S RECORD ");
        gotoxy(15,6);
        cprintf("Enter membership number:");
        int no;
        cin>>no;
        m1=members_search(no);          //calling for search
        //displaying records
        if (m1.no)
        {
            gotoxy(18,9);
            cprintf("The record is");
            gotoxy(20,10);
            cprintf("Number :");
            cout<<m1.no;
            gotoxy(20,11);
            cprintf("Name :");
            puts(m1.name);
            gotoxy(20,12);
            cprintf("Card number :");
            cout<<m1.card;
            gotoxy(20,13);
            cprintf("Address :");
            puts(m1.add);
            gotoxy(20,14);
            cprintf("Telephone :");
            cout<<m1.tel;
            gotoxy(20,15);
            cout<<"Amount :(Rs.)"<<m1.amt;
        }
        else
        {
            gotoxy(17,12);
            cprintf("NO ENTRY\a ");
        }
        gotoxy(15,18);
        cprintf("Any more records desired (Y/N)");
        l=getch();
    } while(tolower(l)=='y');
}

//----------------------------------------------------------------------------
// Function to display screen for 'modify members' records
//----------------------------------------------------------------------------
void modifym()
{
    char l='y';
    do
    {
        textcolor(LIGHTCYAN);
        clrscr();
        border();
        gotoxy(25,2);
        cprintf("MODIFYING MEMBER'S RECORDS ");
        gotoxy(15,5);
        cprintf("Enter the membership number:");
        int no;
        cin>>no;
        members_modify(no);          //calling for modifications
        gotoxy(13,22);
        cprintf("Any more modifications desired(Y/N)");
        l=getch();
    } while(tolower(l)=='y');
}

//----------------------------------------------------------------------------
// Function for creating 'sale.dat'
//----------------------------------------------------------------------------
// Function for billing
//----------------------------------------------------------------------------
void billing()
{
    textcolor(LIGHTRED);
    clrscr();
    border();
    textcolor(LIGHTRED);
    fstream b1;                   //declaring stream
    b1.open("sale.dat",ios::app);    //opening file
    gotoxy(30,2);
    cprintf("BILLING ");
    gotoxy(15,7);
    cprintf("Are you a member(Y/N):");
    float less=1.0;
    char m;
    int no;
    long card;
    m=getche();
    if (tolower(m)=='y')
    {
        gotoxy(18,9);
        cprintf("Enter membership number:");
        cin>>no;
        gotoxy(18,10);
        cprintf("Enter card number:");
        cin>>card;
        m1=members_search(no);
        if (card!=m1.card)         //checking for authenticity of the details
        {
            gotoxy(20,12);
            cprintf("Incorrect \a");
            getch();
            return;                  //undoing billing process
        }
        else
        if (m1.amt>100)
        {
            less=0.95;
            m1.amt-=5;
        }
        else
        {
            gotoxy(20,12);
            cprintf("Amount Less\a");
            gotoxy(15,15);
            cprintf("Continue with normal billing(Y/N)");
            m=getch();
            if (tolower(m)=='n')
                return;
        }
        //decreasing the members' amount if the details are correct
        fstream t3,t4;
        t3.open("members.dat",ios::in);
        t4.open("member1.dat",ios::app);
        t3.seekg(0,ios::beg);
        t3.read((char*)&m2,sizeof(members_record));
        while (!t3.eof())
        {
            if (m2.no!=m1.no)
                t4.write((char*)&m2,sizeof(members_record));
            else
                t4.write((char*)&m1,sizeof(members_record));
            t3.read((char*)&m2,sizeof(members_record));
        }
        t3.close();
        t4.close();
        remove("members.dat");
        rename("member1.dat","members.dat");
    }
    clrscr();
    float total=0.0;
    textcolor(LIGHTGREEN);
    gotoxy(60,1);
    cprintf("p.no.= 0:Exit Billing");
    textcolor(LIGHTRED);
    gotoxy(30,1);
    cprintf("BILLING");
    i=0;
    void table1();         //function declaration for making table
    beg:                    //giving line a name for further reference
    table1();              //calling function for making table
    gotoxy(4,6+i);
    cin>>n1.no;
    ob1=products_search(n1.no);     //searching for product record
    gotoxy(56,6+i);
    float output1(products_record);  //declaring a nested function
    if (n1.no>0)
    {
        if(ob1.no>0)
        {
            cin>>n1.qty;
            strcpy(n1.name,ob1.name);
            n1.rate=ob1.rate;
            n1.total=output1(ob1);
            total+=n1.total;
            fstream t3,t4;
            t3.open("sale.dat",ios::in);
            t4.open("sale1.dat",ios::app);
            t3.seekg(0,ios::beg);
            int qty=n1.qty;
            n1.qty=n1.total/n1.rate;
            char test='y';
            t3.read((char*)&n2,sizeof(tables));
            while (!t3.eof())
            {
                if (n1.no==n2.no)
                {
                    n2.qty+=n1.qty;
                    n2.total+=n1.total;
                    test='n';
                }
                t4.write((char*)&n2,sizeof(tables));
                t3.read((char*)&n2,sizeof(tables));
            }
            if (test=='y')
            {
                t4.seekg(0,ios::end);
                t4.write((char*)&n1,sizeof(tables));
            }
            t3.close();
            t4.close();
            remove("sale.dat");
            rename("sale1.dat","sale.dat");
            n1.qty=qty;
            if (n1.total)
            {
                //reducing the products' stock
                fstream temp3,temp4;
                temp3.open("products.dat",ios::in);
                temp4.open("product1.dat",ios::app);
                temp3.seekg(0,ios::beg);
                temp3.read((char*)&ob1,sizeof(products_record));
                while (!temp3.eof())
                {
                    if (ob1.no==n1.no)
                        ob1.stock-=n1.qty;
                    temp4.write((char*)&ob1,sizeof(products_record));
                    temp3.read((char*)&ob1,sizeof(products_record));
                }
                temp3.close();
                temp4.close();
                remove("products.dat");
                rename("product1.dat","products.dat");
            }
            i++;
            goto beg;
        }
        else
            if (ob1.no==0)
            {
                gotoxy(10,6+i);
                cprintf("No entry\a");
                i++;
                goto beg;
            }
    }
    else
        if (n1.no==0)
        {
            textcolor(WHITE);
            for (int j=0;j<81;j++)          //ending table
            {
                gotoxy(j,6+i);
                cprintf("-");
            }
        }
        textcolor(LIGHTRED);
        gotoxy(5,9+i);
        cprintf("Number of items = ");
        cout<<i;
        gotoxy(5,10+i);
        cprintf("Grand total = Rs.");
        cout<<total;
        //giving discount
        if (less!=1)
        {
            discount+=0.05*total;
            gotoxy(5,12+i);
            cprintf("Discount = Rs.");
            cout<<0.05*total;
            gotoxy(5,13+i);
            cprintf("Net total = Rs.");
            cout<<less*total;
        }
        b1.close();
        getch();
}
//----------------------------------------------------------------------------
// nested function of 'billing'
//----------------------------------------------------------------------------
float output1(products_record ob1)
{
    if (ob1.no==0)    //if no entry then return to billing
    return 0;
    float stotal;
    stotal=ob1.rate*n1.qty; //determining the cost of the particular item
    //putting the values on the screen
    gotoxy(4,6+i);
    cout<<ob1.no;
    gotoxy(10,6+i);
    puts(ob1.name);
    gotoxy(38,6+i);
    cout<<ob1.rate;
    gotoxy(43,6+i);
    cout<<"     ";
    gotoxy(56,6+i);
    if (n1.qty>ob1.stock)     //checking for the item being in stock
    {
        gotoxy(50,6+i);
        cprintf("Out of stock\a");
        return 0;
    }
    cout<<n1.qty;
    gotoxy(68,6+i);
    cout<<stotal;
    gotoxy(74,6+i);
    cout<<"      ";
    return stotal;
}

//----------------------------------------------------------------------------
// Function for making table
//----------------------------------------------------------------------------
void table1()
{
    textcolor(WHITE);
    //drawing vertical lines
    for (int a=1;a<=80;a++)
    {
        gotoxy(a,2);
        cprintf("_");
        gotoxy(a,5);
        cprintf("-");
    }
    //drawing horizontal lines(always)
    for (a=3;a<=5;a++)
    {
        gotoxy(1,a);
        cprintf("|");
        gotoxy(9,a);
        cprintf("|");
        gotoxy(31,a);
        cprintf("|");
        gotoxy(49,a);
        cprintf("|");
        gotoxy(64,a);
        cprintf("|");
        gotoxy(80,a);
        cprintf("|");
    }
    /* drawing horizontal lines
    (depending upon the s.no. of item in purchase list)*/
    gotoxy(1,6+i);
    cprintf("|");
    gotoxy(9,6+i);
    cprintf("|");
    gotoxy(31,6+i);
    cprintf("|");
    gotoxy(49,6+i);
    cprintf("|");
    gotoxy(64,6+i);
    cprintf("|");
    gotoxy(80,6+i);
    cprintf("|");
    textcolor(LIGHTRED);
    //giving column titles
    gotoxy(2,3);
    cprintf("Product");
    gotoxy(14,3);
    cprintf("Product name ");
    gotoxy(35,3);
    cprintf("Rate (Rs.)");
    gotoxy(53,3);
    cprintf("Quantity");
    gotoxy(67,3);
    cprintf("Total (Rs.)");
    gotoxy(2,4);
    cprintf("number");
    gotoxy(53,4);
    cprintf("(Kgs/pcs)");
}

//----------------------------------------------------------------------------
// Function for viewing the day's sale
//----------------------------------------------------------------------------
void sales()
{
    textcolor(LIGHTRED);
    clrscr();
    textcolor(LIGHTRED);
    gotoxy(28,1);
    cprintf("TODAY'S SALES");
    float sales=0.0;
    fstream sal1;
    sal1.open("sale.dat",ios::in);
    i=0;
    sal1.read((char*)&n1,sizeof(n1));
    while(!sal1.eof() && n2.no!=n1.no)
    {
        table1();
        gotoxy(4,6+i);
        cout<<n1.no;
        gotoxy(10,6+i);
        puts(n1.name);
        gotoxy(38,6+i);
        cout<<n1.rate;
        gotoxy(43,6+i);
        cout<<"     ";
        gotoxy(56,6+i);
        cout<<n1.qty;
        gotoxy(68,6+i);
        cout<<n1.total;
        sales+=n1.total;
        gotoxy(74,6+i);
        cout<<"     ";
        i++;
        n2.no=n1.no;
        sal1.read((char*)&n1,sizeof(n1));
    }
    textcolor(WHITE);
    gotoxy(1,6+i);
    for(int n=1;n<=80;n++)
        cprintf("-");
    textcolor(LIGHTRED);
    gotoxy(5,8+i);
    cprintf("Grand total = Rs.");
    cout<<sales;
    gotoxy(5,10+i);
    cprintf("Discount = Rs.");
    cout<<discount;
    gotoxy(5,11+i);
    cprintf("Net total = Rs.");
    cout<<(sales-discount);
    getch();
}

//----------------------------------------------------------------------------
// Instructions
//----------------------------------------------------------------------------
// Function for help on entering records

void enter()
{
    border();
    gotoxy(5,1);
    cprintf("Entering Records");
    gotoxy(5,7);
    textcolor(11);
    cprintf("For Products");
    textcolor(13);
    gotoxy(5,10);
    cprintf("This part of the program helps the store management to ");
    cprintf("add more");
    gotoxy(5,9);
    cprintf("products to their store. The existing product records are");
    cprintf(" not ");
    gotoxy(5,10);
    cprintf("affected by this option. The new record(s) are appended at");
    cprintf(" the end");
    gotoxy(5,11);
    cprintf("of the file containing such records namely ");
    textcolor(12);
    cprintf("'products.dat'");
    textcolor(13);
    cprintf(". This");
    gotoxy(5,12);
    cprintf("option automatically assigns a product number to the product");
    cprintf(" which");
    gotoxy(5,13);
    cprintf("must be remembered for any product reference.");
    gotoxy(5,15);
    textcolor(11);
    cprintf("For members");
    textcolor(13);
    gotoxy(5,17);
    cprintf("This option works just like its counterpart for products. It");
    cprintf(" stores");
    gotoxy(5,18);
    cprintf("records in the file ");
    textcolor(12);
    cprintf("'members.dat'");
    textcolor(13);
    cprintf(" and assigns a membership number ");
    gotoxy(5,19);
    cprintf("for every new entry. For further details see the help section");
    cprintf(" on ");
    textcolor(12);
    gotoxy(5,20);
    cprintf("'Membership Rules'.");
    textcolor(13);
    getch();
}

//Function for help on viewing records

void view()
{
    border();
    gotoxy(30,5);
    cprintf("Viewing Records");
    gotoxy(10,7);
    cprintf("This option enables the user to view the latest records of ");
    gotoxy(10,8);
    cprintf("either products or members. It helps in operations like ");
    gotoxy(10,9);
    cprintf("stock checking and member verification. The viewing is");
    gotoxy(10,10);
    cprintf("only possible with the product/membership numbers.");
    getch();
}

//Function for help on modifying records
void modify()
{
    border();
    gotoxy(30,5);
    cprintf("Modifying Records");
    gotoxy(10,7);
    cprintf("This option helps in altering the records in the files.");
    gotoxy(10,8);
    cprintf("It can be used for deleting the entries as well. In ");
    gotoxy(10,9);
    cprintf("case of products either the record could be changed to");
    gotoxy(10,10);
    cprintf("some new entry or its stock could be made zero. For members");
    gotoxy(10,11);
    cprintf("deletion is only possible by overwriting with a new entry.");
    getch();
}

// Function for help on billing process
void procedure()
{
    border();
    gotoxy(30,5);
    cprintf("Billing Procedure");
    gotoxy(10,7);
    cprintf("The actual billing procedure consists of two sections.");
    gotoxy(10,8);
    cprintf("One checks if the buyer is a member or not and accordingly");
    gotoxy(10,9);
    cprintf("performs the necessary tasks. The other section consists of ");
    gotoxy(10,10);
    cprintf("billing. The user is asked to enter the product number and the ");
    gotoxy(10,11);
    cprintf("quantity bought. The computer calculates the total itself and ");
    gotoxy(10,12);
    cprintf("also the discount if necessary. In order to exit the procedure");
    gotoxy(10,13);
    cprintf("and view the final total, the user should enter the product number");
    gotoxy(10,14);
    cprintf("as '0'.");
    getch();
}

// Function for help on Membership details
void rules()
{
    border();
    gotoxy(30,5);
    cprintf("Membership Rules");
    gotoxy(5,7);
    cprintf("The program lets its subscribers (stores) maintain a");
    cprintf(" member's list");
    gotoxy(5,8);
    cprintf("in order to help them in increasing their sales for a");
    cprintf(" marginal cut");
    gotoxy(5,9);
    cprintf("in their profits. The program sets minimum membership ");
    cprintf("amount as Rs.100");
    gotoxy(5,10);
    cprintf("which must be paid at the time of registration. The member");
    cprintf(" will be ");
    gotoxy(5,11);
    cprintf("given a membership number and a membership card (to be");
    cprintf("collected ");
    gotoxy(5,12);
    cprintf("after a week by reference to the membership number and ");
    cprintf("other");
    gotoxy(5,13);
    cprintf("particulars). In case a member loses the membership card ");
    cprintf(", he/she ");
    gotoxy(5,14);
    cprintf("must register a complaint with the store by submitting a");
    cprintf(" written");
    gotoxy(5,15);
    cprintf("application with all the particulars. He/She can collect ");
    cprintf("his/her ");
    gotoxy(5,16);
    cprintf("remaining money by showing proofs of the particulars.");
    gotoxy(5,17);
    cprintf("The membership allows a person to avail a special discount");
    cprintf(" of 5%");
    gotoxy(5,18);
    cprintf("over every purchase. Rs.5 will be subtracted from the ");
    cprintf("member's account");
    gotoxy(5,19);
    cprintf("over every purchase. The account will be rendered ");
    cprintf("inaccessible if the ");
    gotoxy(5,20);
    cprintf("amount will be less than Rs.100 and the member would be");
    cprintf(" expected to ");
    gotoxy(5,21);
    cprintf("deposit more money for continuing the membership. The store");
    cprintf(" will also");
    gotoxy(5,22);
    cprintf("give away attractive gifts to a lucky member once every year.");
    getch();
}

// Functiom for help on today's sales

void today()
{
    border();
    gotoxy(30,5);
    cprintf("Today's sales");
    gotoxy(10,7);
    cprintf("This option shows the total sales in terms of both quantity");
    gotoxy(10,8);
    cprintf("and amount per item. This is stored in a file namely ");
    gotoxy(10,9);
    cprintf("'sale.dat' which is modified after every buying during the");
    gotoxy(10,10);
    cprintf("billing process.");
    getch();
}

//Function for displaying help index
void instructions()
{
    clrscr();
    int n;
    char l='y';
    do
    {
        textcolor(13);
        border();
        textcolor(13);
        gotoxy(30,5);
        cprintf("HELP INDEX");
        for (int z=29;z<=39;z++)
        {
            gotoxy(z,6);
            cprintf("-");
        }
        gotoxy(20,7);
        cprintf("1:ADD RECORDS");
        gotoxy(20,8);
        cprintf("2:VIEWING RECORDS ");
        gotoxy(20,9);
        cprintf("3:MODIFYING RECORDS");
        gotoxy(20,10);
        cprintf("4:BILLING PROCEDURE");
        gotoxy(20,11);
        cprintf("5:TODAY'S SALES ");
        gotoxy(20,12);
        cprintf("6:MEMBERSHIP DETAILS");
        gotoxy(20,13);
        cprintf("0:BACK TO MAIN MENU");
        gotoxy(21,16);
        cprintf("Enter your choice:");
        cin>>n;
        switch(n)
        {
            case 1:    enter();
                break;
            case 2:    view();
                break;
            case 3:    modify();
                break;
            case 4:    procedure();
                break;
            case 5:    today();
                break;
            case 6:    rules();
                break;
            case 0:    l='n';
        }
    } while (l=='y');
}

//---------------------------------------------------------------------------
// Function for ending screen
//----------------------------------------------------------------------------

void end()
{
    gdriver=DETECT;       //request auto detection
    initgraph(&gdriver,&gmode,"..\bgi");  //initialising graph
    /* read result of initialization */
    int errorcode = graphresult();
    if (errorcode != grOk)  /* an error occurred */
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        return;
    }
    setcolor(BROWN);
    setbkcolor(WHITE);
    rectangle(10,10,getmaxx()-10,getmaxy()-10);
    rectangle(15,15,getmaxx()-15,getmaxy()-15);
    settextstyle(7,0,8);
    moveto(90,75);
    outtext("THANK YOU");
    closegraph();
}