Professional Documents
Culture Documents
ON
Daily Stock Controller
SUBMITTED BY
HAMID SEID-------------------------------------1619/09
MUKTAR MUHAMED--------------------------1629/09
EDIDIYA ENGDAWORK------------------------1608/09
SEID MOHAMMED-----------------------------1640/09
NASR EBRAHIM---------------------------- 2219/10
September, 2020
Dessie, Ethiopia
DAILY STOCK CONTROLLER
Approval Sheet
Advisor Sign
______________ ____________
Examiner,
______________ _____________
Examiner,
_______________ _____________
ACKNOWLEDGEMENT
This project is prepared in the partial fulfillment of the requirement for the degree of Bachelor
of Science in computer science. The satisfaction and success of completion of this task would be
incomplete without heartfelt thanks to people whose constant guidance, support and
encouragement made this work successful. On doing this undergraduate project we have been
fortunate to have help, support and encouragement from many people we would like to
acknowledge them for their cooperation.
Our first thanks goes to Unity University for designing such a worthy syllabus and making us do
this project. Our next batch of thanks goes to the department of computer science of unity
university Dessie special campus instructors without those help our project would have been
impossible.
ABSTRACT
This project is aimed at developing an android based application named Daily Stock Controller
(DSC) for managing the inventory system of retail shop. The Daily stock controller refers to the
system and processes to manage the stock of organization with the involvement of Technology
system. This system can be used to store the details of the inventory, stock maintenance,
update the inventory based on the sales details, generate sales and inventory report daily. This
project is categorizing individual aspects for the sales and inventory management system. In
this system we are solving different problem affecting to direct sales management and
purchase management. Inventory Management System is important to ensure quality control
in businesses that handle transactions resolving around consumer goods. Without proper
inventory control, a large retail store may run out of stock on an important item. A good
inventory management system will alert the wholesaler when it is time to record. Daily stock
controller is also on important means of automatically tracking large stock data. An automated
Daily stock controller helps to minimize the errors while recording the stock.
LIST OF FIGURE
Figure 1. 1 Work breakdown structure for DSC...........................................................................17
LIST OF TABLE
Table 3. 1 Register use case description.......................................................................................30
Table 3. 2 Login use case description...........................................................................................31
Table 3. 3 Add items use case description.....................................................................................32
Table 3. 4 sell items use case description.....................................................................................33
Table 3. 5 All items use case description......................................................................................34
Table 3. 6 Available items use case description............................................................................35
Table 3. 7 Sold items use case description....................................................................................36
Table 3. 8 Available in items use case description........................................................................37
Table 3. 9 Sold Out items use case description.............................................................................38
Table 3. 10 Expired items use case description............................................................................39
Table 3. 11 less than three months to expire use case description...............................................40
Table 3. 12 less than six months to expire use case description...................................................41
Table 3. 13 Generate barcode use case description.....................................................................42
Table 3. 14 Generate QR code use case description.....................................................................43
Table of Contents
ACKNOWLEDGEMENT.................................................................................................................3
ABSTRACT......................................................................................................................................4
LIST OF FIGURE...........................................................................................................................5
LIST OF TABLE..............................................................................................................................7
CHAPTER ONE............................................................................................................................11
1: Introduction to Daily stock controller................................................................................................11
1.2 General Organizational Background................................................................................................11
1.3 Motivation and Justification............................................................................................................12
1.4 Statement of the problem...............................................................................................................12
1.5 Objective of the Project...................................................................................................................12
1.5.1 General Objectives....................................................................................................................12
1.5.2 Specific Objectives....................................................................................................................13
1.6 Significance of the Project...............................................................................................................13
1.7 Cost Benefit Analysis........................................................................................................................14
1.7.1 Tangible Benefits:.....................................................................................................................14
1.7.2: Intangible Benefits...................................................................................................................15
1.8 Scope of the Application..................................................................................................................15
1.9 Methodology...................................................................................................................................15
1.9.1 Data Source..............................................................................................................................15
1.9.2 Requirement Analysis...............................................................................................................16
1.10 Work Breakdown Structure...........................................................................................................16
1.11 Hardware and Software Requirements.........................................................................................18
1.11.1: Hardware Requirements........................................................................................................18
1.11.2 Software Requirements..........................................................................................................18
CHAPTER TWO............................................................................................................................18
Requirement Gathering.........................................................................................................................18
2.1 Existing System Description.............................................................................................................18
2.1.1 Description of the Major Activities in the Existing System........................................................18
2.1.2 Work Flow of Existing System...................................................................................................19
2.2 Problem Definition...........................................................................................................................20
2.3 Broad Alternative Solution...............................................................................................................21
CHAPTER ONE
Introduction
1: Introduction to Daily stock controller
The project Daily stock controller is a complete android-based application designed on Java
using android Studio Software. The main aim of the project is to develop Inventory
Management System Model software in which all the information regarding the stock of the
organization will be presented. It is fully offline based android application which has username
and password to manage the inventory and maintenance of the inventory system securely.
Each new stock is created and entitled with the named and the entry date of that stock and it
can also be update any time when required as per the transaction or the sales is returned in
case. Here the login page is created in order to protect the management of the stock of
organization in order to prevent it from the threads and misuse of the inventory.
Therefore, it is important to have an android based (DSC) which has the ability to generate
reports, maintain the balance of the stock, details about the purchase and sales in the
organization. Before developing this application, we came up with some Inventory
After analyzing the other inventory management system, we decided to include some of
common and key features that should be included in every inventory management system. So
we decided to include those things that help the small organization in a way or other.
reliably.
To develop an application that deals with the day to day requirement of any production
organization
To develop the easy management of the inventory
To handle the inventory details like sales details, purchase details and balance stock
details.
To provide competitive advantage to the organization.
To provide details information about the stock balance.
To make the stock manageable and simplify the use of inventory in the organization.
Sales details: It show the details about the sales and the remaining stock of sales. It also
shows the details about the sales in return.
Add items: It stores items information in to SQLite database like items name, items
barcode or QR code, items description, items category, items purchased value, items
sales value, supplier name, supplier phone and expired date.
Sell items: It can scan barcode or QR code and add items to cart based on scanner
information and calculate all items in cart and then display total price.
Expired Date: It show items that already expired and also notify items that will be expire
after three month or six months.
Identical items: it shows items by their group or category it’s important to count items
and then match the number of items in physical stock data and database.
barcode and QR code generator: it’s very important generating barcode and QR code.
As we know some local items haven’t barcode or QR code our app Daily stock controller
all system depends on barcode and QR code so we have to generate barcode or QR code
to be able to scan items;
1.9 Methodology
1.9.1 Data Source
We started research by identifying the need of IMS in the organization. Initially we bounded our
research to find the general reasons that emerged the needs of Inventory Management System.
We used different techniques to collect the data that can clearly give us the overall image of
the application. The techniques we used were interview with the Merchant, visiting online
websites that are presented as the templates and visiting some organization to see their IMS
application. Basically the following factors forced us to develop DSC application:
CHAPTER TWO
Requirement Gathering
2.1 Existing System Description
Almost all retail shops are currently using a manual system to store information about their
transaction, for example record new item information, record sell transaction and calculate
total sold items price are done manually.
The flow of data from external entities into the manual document, showed how the data
moved from one process to another, as well as its logical storage. There are four symbols in the
data flow diagram of the following diagram:
Performance
The performance of existing system does not serve customer fast because the merchant
calculates total transaction manually and also its not reliable.
Economical
The retail shop almost there is no cost for manage their shop transaction but If merchant wants
to buy a cash register, it’s very expensive, because of this reason many retailers does not use
cash registers.
Controlling
Since all the records associated with the manual System are recorded and stored manually the
security that the system provides for the privacy of this records is not reliable. The system
cannot provide sufficient protection for access and manipulation of the records associated with
the system.
Efficiency
As we mentioned earlier retail shop has many problems for example it’s not reliable, it’s not
fast, and they calculate transaction manually.
The point of sale is often referred to as the point of service because it is not just a point of sale
but also a point of return or customer order. POS terminal software may also include features
for additional functionality, such as inventory management, CRM, financials, or warehousing.
Registration page: Its appear once when the user installs DSC app for first time. This form can
register the merchant username and password in to SQLite database.
Login page: As application starts the login page appears. User login is determined by the
username and password that has all the authority to add and update the stock of the
organization as per the requirement.
Sales details: It show the details about the sales and the remaining stock of sales. It also shows
the details about the sales in return.
Purchase details: It shows the details about the purchase made by the organization along with
the price.
Profit details: It shows the details about income profit of retail shop daily based.
Add items: It stores items information in to SQLite database like items name, items barcode or
QR code, items description, items category, items purchased value, items sales value, supplier
name, supplier phone and expired date.
Sell items: It can scan barcode or QR code and add items to cart based on scanner information
and calculate all items in cart and then display total price.
Expired Date: It show items that already expired and also notify items that will be expire after
three month or six months.
Identical items: it shows items by their group or category it’s important to count items and
then match the number of items in physical stock data and database.
barcode and QR code generator: it’s very important generating barcode and QR code. As we
mentioned some local items haven’t barcode or QR code our app Daily stock controller all
system depends on barcode and QR code so we have to generate barcode or QR code to be
able to scan items;
Nonfunctional requirement is also a requirement that specifies criteria that can be used to
judge the operation of the system, rather the specifies behaviors. It defines how a system is
supported. Nonfunctional requirement is often called qualities of a system.
Performance: Focus should be kept on monitoring and managing the performance and
service availability of software.
While a use case itself might drill into a lot of detail (such as, flow of events and scenarios)
about every possibility, a use-case diagram can help provide a higher-level view of the system,
providing the simplified and graphical representation of what the system must actually do.
The actors are merchant he has all permissions to access, modify and add items into database.
If user click on add items: - The system open add items activity to the user.
If user click on sell items: - The system open sell items activity to the user.
If user click on all items: - The system opens all items activity to the user.
CHAPTER THREE
System Analysis
Requirement id UC1
This use case describes the process of registering user into database
Description
Actor Merchant
Alternative If a password conformation does not match the system display error
course of action message.
Table
3. 1 Register use case description
Requirement id UC2
Description This use case describes the process of login into the system.
Actor Merchant
Pre-condition The merchant should registered in the system
Alternative course of action If username and password is incorrect the system display
error message.
Requirement id UC3
This use case describes the process of registering new items into
Description database.
Actor Merchant
Alternative course of If some of the fields are not filled, the system send notification
action to merchant to fill unfilled fields.
Actor Merchant
Post-condition The system display Total transaction and update item status
Actor Merchant
Actor Merchant
This use case describes the process of selecting available
Description items from database.
Alternative course of action If there is no data in database the system display message.
Actor Merchant
This use case describes the process of selecting sold items
Description from database.
Alternative course of action If there is no data in database the system display message.
Actor Merchant
This use case describes the process of selecting available
Description items from database which is the same type of items.
Requirement id UC9
Actor Merchant
This use case describes the process of selecting sold items
Description from database which is the same type of items.
Requirement id UC10
Actor Merchant
This use case describes the process of selecting expired items
Description from database.
Alternative course of action If there is no data in database the system display message.
Requirement id UC11
Actor Merchant
This use case describes the process of selecting items from
Description database which have less than three months to expire.
Alternative course of action If there is no data in database the system display message.
Requirement id UC12
Actor Merchant
This use case describes the process of selecting items from
Description database which have less than six months to expire.
Alternative course of action If there is no data in database the system display message.
Requirement id UC13
Actor Merchant
This use case describes the process of generating barcode.
Description
Alternative course of action If the field is not filled, the system send notification to the
merchant to fill unfilled field.
Requirement id UC14
Actor Merchant
This use case describes the process of generating QR code.
Description
Alternative course of action If the field is not filled, the system send notification to the
merchant to fill unfilled field.
A sequence diagram shows, as parallel vertical lines (lifelines), different processes or objects
that live simultaneously, and, as horizontal arrows, the messages exchanged between them, in
the order in which they occur. This allows the specification of simple runtime scenarios in a
graphical manner.
Class diagram describes the attributes and operations of a class and also the constraints
imposed on the system. The class diagrams are widely used in the modeling of object oriented
systems because they are the only UML diagrams, which can be mapped directly with object-
oriented languages.
The control flow is drawn from one operation to another. This flow can be sequential,
branched, or concurrent. Activity diagrams deal with all type of flow control by using different
elements such as fork, join, etc.
CHAPTER FOUR
System Design
System design is the phase that bridges the gap between problem domain and the existing
system in a manageable way. This phase focuses on the solution domain, i.e. “how to
implement?”
It is the phase where the SRS document is converted into a format that can be implemented
and decides how the system will operate.
In this phase, the complex activity of system development is divided into several smaller sub-
activities, which coordinate with each other to achieve the main objective of system
development.
A sequence diagram shows, as parallel vertical lines (lifelines), different processes or objects
that live simultaneously, and, as horizontal arrows, the messages exchanged between them, in
the order in which they occur. This allows the specification of simple runtime scenarios in a
graphical manner.
Class diagram describes the attributes and operations of a class and also the constraints
imposed on the system. The class diagrams are widely used in the modeling of object oriented
systems because they are the only UML diagrams, which can be mapped directly with object-
oriented languages.
Login
Column Type Null Default
Id Integer(Auto Increment) No
Username Text No
Password Text No
Table 4. 1 Login Table
Stock
Column Type Null Default
Id Integer(Auto increment) No
Product Name Text No
Barcode Long No
Description Text No
Category Text No
Purchased Price Float No
Sales Price Float No
Items Status Text No
Supplier Name Text No
Expired date Long No
It visualizes the relationships as well as the organization between the components present in
the system. It helps in forming an executable system. A component is a single unit of the
system, which is replaceable and executable. The implementation details of a component are
hidden, and it necessitates an interface to execute a function. It is like a black box whose
behavior is explained by the provided and required interfaces.
It ascertains how software is deployed on the hardware. It maps the software architecture
created in design to the physical system architecture, where the software will be executed as a
node. Since it involves many nodes, the relationship is shown by utilizing communication paths.
CHAPTER FIVE
Testing and Implementations
5.1 Testing
The purpose of software testing is to access or evaluate the capabilities or attributes of a
software program’s ability to adequately meet the applicable standards and application need.
Testing does not ensure quality and the purpose of testing is not to find bugs. Testing can be
verification and validation or reliability estimation. The primary objective if testing includes:
Type of Testing
We have used one type of testing to ensure the error free features of our mobile application:
Units Test
This type of testing is the testing of individual software components. It is typically done by the
programmer and not by the testers. It requires details information and knowledge about the
internal program design and code to perform this.
During unit testing, we carried out various testing task such as the reflection of the unit data on
database and its interface. Various types of bugs associated with the component were
identified and fixed.
package unity.universityfinalproject.dailystockcontroller;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
MyDatabaseHelper db;
EditText mTextUsername, mTextPassword, mTextConfPassword;
Button mButtonRegister;
TextView mTextViewLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
db = new MyDatabaseHelper(this);
mTextUsername = (EditText) findViewById(R.id.editText_username);
mTextPassword = (EditText) findViewById(R.id.editText_password);
mTextConfPassword = (EditText) findViewById(R.id.editText_Conf_password);
mButtonRegister = (Button) findViewById(R.id.button_register);
mTextViewLogin = (TextView) findViewById(R.id.login_txt);
mTextViewLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent loginIntent = new
Intent(RegisterActivity.this,MainActivity.class);
startActivity(loginIntent);
}
});
mButtonRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String user = mTextUsername.getText().toString().trim();
String password = mTextPassword.getText().toString().trim();
String conf_password = mTextConfPassword.getText().toString().trim();
if(password.equals(conf_password)){
}else{
Toast.makeText(RegisterActivity.this,"Password is not
Matching",Toast.LENGTH_SHORT).show();
}
}
});
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
MyDatabaseHelper db;
EditText mTextUsername, mTextPassword;
Button mButtonLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new MyDatabaseHelper(this);
getRegisterdUser();
}else{
Toast.makeText(MainActivity.this,"Login
failed",Toast.LENGTH_SHORT).show();
}
}
});
}
void getRegisterdUser(){
Cursor cursor = db.readRegisterUser();
if(cursor.getCount() == 0) {
Intent registerIntent = new
Intent(MainActivity.this,RegisterActivity.class);
startActivity(registerIntent);
// Toast.makeText(this,"No data.",Toast.LENGTH_SHORT).show();
}
else{
while (cursor.moveToNext()){
}
}
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.google.zxing.client.result.ProductParsedResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
goToAddActivity = findViewById(R.id.goToAddimage);
goToAddActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent addActivityIntent = new
Intent(MenuActivity.this,AddActivity.class);
startActivity(addActivityIntent);
}
});
goToSellActivity = findViewById(R.id.goToSellimage);
goToSellActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent goToSellActivity = new
Intent(MenuActivity.this,SellActivity.class);
startActivity(goToSellActivity);
}
});
goToBarcodeGenerator = findViewById(R.id.generateBarcodeBtn);
goToBarcodeGenerator.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.service.autofill.RegexValidator;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.basgeekball.awesomevalidation.AwesomeValidation;
import com.basgeekball.awesomevalidation.ValidationStyle;
import com.basgeekball.awesomevalidation.utility.RegexTemplate;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
if(awesomeValidation.validate()){
MyDatabaseHelper myDB = new MyDatabaseHelper(AddActivity.this);
myDB.addItemTomyDB(product_name_Input.getText().toString().trim(),
Long.parseLong(addBarcode.getText().toString().trim()),
description_Input.getText().toString().trim(),
category_Input.getText().toString().trim(),
Float.parseFloat(purchased_price_Input.getText().toString().trim()),
Float.parseFloat(sales_price_Input.getText().toString().trim()),
item_status.getText().toString().trim(),
supplier_name_Input.getText().toString().trim(),
Long.parseLong(supplier_phone_Input.getText().toString().trim()),
Long.parseLong(exp_date_Input.getText().toString().trim()));
});
}
void ImageScannerToAdd(){
addDoneBtn = findViewById(R.id.addDonebtnOk);
scanToAdd = findViewById(R.id.ScanToAddImage);
addBarcode = findViewById(R.id.AddBarcodeEditText);
product_name_Input = findViewById(R.id.editProduct_name);
description_Input = findViewById(R.id.editDesc);
purchased_price_Input = findViewById(R.id.editPurch_Price);
sales_price_Input = findViewById(R.id.editSell_Price);
category_Input = findViewById(R.id.editCategory);
supplier_name_Input = findViewById(R.id.editSupplier_Name);
supplier_phone_Input = findViewById(R.id.editSupplier_Phone);
exp_date_Input = findViewById(R.id.editExp_date);
item_status = findViewById(R.id.item_status_add);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent
}
}
else
{
super.onActivityResult(requestCode, resultCode, data);
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.ArrayList;
//go to menuActivity
sellViewId();
sellDone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent goToMenuActivity = new
Intent(SellActivity.this,MenuActivity.class);
startActivity(goToMenuActivity);
}
});
addToCart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(scanResultAndSearch.length() == 0 || scanResultAndSearch == null)
{
Toast.makeText(SellActivity.this,"No Item In
Cart",Toast.LENGTH_SHORT).show();
}else{
scanResultAndSearch.getText().clear();
scanResultAndSearch.setText("");
calculateItems();
updateStatus();
addToCart.setVisibility(View.GONE);
removeToCart.setVisibility(View.GONE);
}
}
});
Toast.makeText(SellActivity.this,"No Item In
Cart",Toast.LENGTH_SHORT).show();
}else{
scanResultAndSearch.getText().clear();
scanResultAndSearch.setText("");
calculateRemoveItems();
updateRemoveStatus();
addToCart.setVisibility(View.GONE);
removeToCart.setVisibility(View.GONE);
}
}
});
}
void sellItemScannerActivity(){
sellScanImage = findViewById(R.id.sellScanImage);
scanResultAndSearch = findViewById(R.id.scanResultEditText);
addToCart = findViewById(R.id.addToCart);
removeToCart = findViewById(R.id.removeToCart);
dispResultTxt = findViewById(R.id.dispResultTxt);
}
private void scanCode() {
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent
data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode,
resultCode, data);
if(result != null){
if(result.getContents() != null){
scanResultAndSearch.setText(result.getContents());
col_id = new ArrayList<>();
product_name_Input = new ArrayList<>();
addBarcode = new ArrayList<>();
description_Input = new ArrayList<>();
displaySingleData();
setToRecyclerView();
}
}
else
{
Toast.makeText(this,"No Result", Toast.LENGTH_LONG).show();
}
}
else
{
super.onActivityResult(requestCode, resultCode, data);
}
}
void sellViewId(){
sellRecyclerView = findViewById(R.id.sellRecyclerView);
sellDone = findViewById(R.id.sellDone);
}
void displaySingleData(){
}
void setToRecyclerView(){
customAdapter = new CustomAdapter(SellActivity.this,this,col_id,
product_name_Input,addBarcode,description_Input,category_Input,purchased_price_Input,
sales_price_Input,item_status,supplier_name_Input,supplier_phone_Input,gen_barcode,ex
p_date_Input);
sellRecyclerView.setAdapter(customAdapter);
sellRecyclerView.setLayoutManager(new
LinearLayoutManager(SellActivity.this));
}
void calculateItems(){
float result = Float.parseFloat(dispResultTxt.getText().toString());
total = result + sellPrice;
dispResultTxt.setText(String.valueOf(total));
}
void updateStatus(){
MyDatabaseHelper myDB = new MyDatabaseHelper(SellActivity.this);
myDB.updateItem(statusId);
}
void calculateRemoveItems(){
float result = Float.parseFloat(dispResultTxt.getText().toString());
total = result - sellPrice;
dispResultTxt.setText(String.valueOf(total));
}
void updateRemoveStatus(){
MyDatabaseHelper myDB = new MyDatabaseHelper(SellActivity.this);
myDB.updateAvaliableItem(statusId);
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
expiredCounterTxt4 = findViewById(R.id.expiredCounterTxt4);
lossBirrCounterTxt4 = findViewById(R.id.lossBirrCounterTxt4);
lossProfitCounterTxt4 = findViewById(R.id.lossProfitCounterTxt4);
expsoldTxt4 = findViewById(R.id.expsoldTxt4);
currentTimeTxt4 = findViewById(R.id.currentTimeTxt4);
dispAllItemDataToRec();
dispAllProfitItem();
expiredCounterTxt4.setText(soldCounter);
itemsRecycler4 = findViewById(R.id.dispAllRecycler);
customAdapter = new CustomAdapter(AllProductActivity.this,this,col_id,
product_name_Input,addBarcode,description_Input,category_Input,purchased_price_Input,
sales_price_Input,item_status,supplier_name_Input,supplier_phone_Input,gen_barcode,ex
p_date_Input);
itemsRecycler4.setAdapter(customAdapter);
itemsRecycler4.setLayoutManager(new
LinearLayoutManager(AllProductActivity.this));
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent
data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1){
recreate();
}
}
void dispAllItemDataToRec(){
Cursor cursor = myDB.readAllData();
if(cursor.getCount() == 0) {
Toast.makeText(this,"No data.",Toast.LENGTH_SHORT).show();
}
else{
while (cursor.moveToNext()){
col_id.add((cursor.getString(0)));
product_name_Input.add(cursor.getString(1));
addBarcode.add(cursor.getString(2));
description_Input.add(cursor.getString(3));
category_Input.add(cursor.getString(4));
purchased_price_Input.add(cursor.getString(5));
purchBirr = Float.parseFloat(cursor.getString(5));
purchLoss = Float.parseFloat(cursor.getString(5));
sales_price_Input.add(cursor.getString(6));
soldBirr = Float.parseFloat(cursor.getString(6));
item_status.add(cursor.getString(7));
supplier_name_Input.add(cursor.getString(8));
supplier_phone_Input.add(cursor.getString(9));
gen_barcode.add(cursor.getString(10));
exp_date_Input.add(cursor.getString(11));
soldCounter = String.valueOf(cursor.getCount());
calculateAllItems();
}
}
}
float lossResult =
Float.parseFloat(lossBirrCounterTxt4.getText().toString());
lossTotal = lossResult + soldBirr;
lossBirrCounterTxt4.setText(String.valueOf(lossTotal));
float resultProfit =
Float.parseFloat(lossProfitCounterTxt4.getText().toString());
profitTotal =resultProfit + purchLoss;
lossProfitCounterTxt4.setText(String.valueOf(profitTotal));
}
void dispAllProfitItem(){
profitResult = Float.parseFloat(lossBirrCounterTxt4.getText().toString()) -
Float.parseFloat(lossProfitCounterTxt4.getText().toString());
lossProfitCounterTxt4.setText(String.valueOf(profitResult));
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
goToSoldItems = findViewById(R.id.goToSoldItems);
goToSoldItems.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent goToSoldActivity = new
Intent(CounterMenuActivity.this,SoldItemsCounterActivity.class);
startActivity(goToSoldActivity);
}
});
goToAvailableItems = findViewById(R.id.goToAvailableItems);
goToAvailableItems.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
package unity.universityfinalproject.dailystockcontroller;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.util.ArrayList;
RecyclerView unsoldItemRecyclerView;
EditText unsoldItemEdit;
ImageView unsoldItemScanImg;
TextView itemCounterTxt2, birrCounterTxt2, catagoryTxt2, profitCounterTxt2;
long singId2, soldsingleId2;
long statusId2;
float total = 0;
float profitTotal = 0;
float profitResult = 0;
float sellPrice, purchPrice;
String categoryunSold, unsoldCounter;
MyDatabaseHelper myDB;
ArrayList<String> col_id,
product_name_Input,addBarcode,description_Input,category_Input,purchased_price_Input,
sales_price_Input,item_status,supplier_name_Input,supplier_phone_Input,gen_barcode,
exp_date_Input;
CustomAdapter customAdapter;
@Override
soldItemsId();
unsoldItemScanImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { scanSoldCode(); }});
}
void soldItemsId(){
unsoldItemRecyclerView = findViewById(R.id.soldItemRecyclerView2);
unsoldItemEdit = findViewById(R.id.soldItemEdit2);
unsoldItemScanImg = findViewById(R.id.soldItemScanImg2);
itemCounterTxt2 = findViewById(R.id.itemCounterTxt2);
birrCounterTxt2 = findViewById(R.id.birrCounterTxt2);
catagoryTxt2 = findViewById(R.id.catagoryTxt2);
profitCounterTxt2 = findViewById(R.id.profitCounterTxt2);
}
void unsoldRecyclerView(){
customAdapter = new
CustomAdapter(AvailableItemsCounterActivity.this,this,col_id,
product_name_Input,addBarcode,description_Input,category_Input,purchased_price_Input,
sales_price_Input,item_status,supplier_name_Input,supplier_phone_Input,gen_barcode,ex
p_date_Input);
unsoldItemRecyclerView.setAdapter(customAdapter);
unsoldItemRecyclerView.setLayoutManager(new
LinearLayoutManager(AvailableItemsCounterActivity.this));
}
void displayUnsoldData(){
categoryunSold = cursor.getString(4);
}
void displayUpdateUnsoldData(){
calculateUnsoldItems();
}
}
}
private void scanSoldCode() {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent
data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode,
resultCode, data);
if(result != null){
if(result.getContents() != null){
unsoldItemEdit.setText(result.getContents());
col_id = new ArrayList<>();
product_name_Input = new ArrayList<>();
addBarcode = new ArrayList<>();
description_Input = new ArrayList<>();
category_Input = new ArrayList<>();
purchased_price_Input = new ArrayList<>();
sales_price_Input = new ArrayList<>();
item_status = new ArrayList<>();
supplier_name_Input = new ArrayList<>();
supplier_phone_Input = new ArrayList<>();
gen_barcode = new ArrayList<>();
exp_date_Input = new ArrayList<>();
}
}
else
{
super.onActivityResult(requestCode, resultCode, data);
}
}
void calculateUnsoldItems(){
float result = Float.parseFloat(birrCounterTxt2.getText().toString());
total = result + sellPrice;
birrCounterTxt2.setText(String.valueOf(total));
float resultPtofit =
Float.parseFloat(profitCounterTxt2.getText().toString());
profitTotal = resultPtofit + purchPrice;
profitCounterTxt2.setText(String.valueOf(profitTotal));
}
void ProfitUnsoldItem(){
profitResult = Float.parseFloat(birrCounterTxt2.getText().toString()) -
Float.parseFloat(profitCounterTxt2.getText().toString());
profitCounterTxt2.setText(String.valueOf(profitResult));
}
}
package unity.universityfinalproject.dailystockcontroller;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
Code for Expired items, Less than 3 month to expire and Less than 6
month to expire:
package unity.universityfinalproject.dailystockcontroller;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
expiredItemDataToRec();
lossProfitExpiredItem();
expiredCounterTxt.setText(soldCounter);
expiredItemsRecycler = findViewById(R.id.expiredItemsRecycler);
customAdapter = new CustomAdapter(ExpiredDateActivity.this,this,col_id,
product_name_Input,addBarcode,description_Input,category_Input,purchased_price_Input,
sales_price_Input,item_status,supplier_name_Input,supplier_phone_Input,gen_barcode,ex
p_date_Input);
expiredItemsRecycler.setAdapter(customAdapter);
expiredItemsRecycler.setLayoutManager(new
LinearLayoutManager(ExpiredDateActivity.this));
}
void expiredItemDataToRec(){
Cursor cursor = myDB.readExpiredData(currentDate);
if(cursor.getCount() == 0) {
Toast.makeText(this,"No data.",Toast.LENGTH_SHORT).show();
}
else{
while (cursor.moveToNext()){
col_id.add((cursor.getString(0)));
product_name_Input.add(cursor.getString(1));
addBarcode.add(cursor.getString(2));
description_Input.add(cursor.getString(3));
category_Input.add(cursor.getString(4));
purchased_price_Input.add(cursor.getString(5));
purchBirr = Float.parseFloat(cursor.getString(5));
purchLoss = Float.parseFloat(cursor.getString(5));
sales_price_Input.add(cursor.getString(6));
soldBirr = Float.parseFloat(cursor.getString(6));
item_status.add(cursor.getString(7));
supplier_name_Input.add(cursor.getString(8));
supplier_phone_Input.add(cursor.getString(9));
gen_barcode.add(cursor.getString(10));
exp_date_Input.add(cursor.getString(11));
soldCounter = String.valueOf(cursor.getCount());
calculateExpiredItems();
}
}
}
void calculateExpiredItems(){
float resultProfit =
Float.parseFloat(lossProfitCounterTxt.getText().toString());
profitTotal =resultProfit + purchLoss;
lossProfitCounterTxt.setText(String.valueOf(profitTotal));
}
void lossProfitExpiredItem(){
profitResult = Float.parseFloat(expsoldTxt.getText().toString()) -
Float.parseFloat(lossProfitCounterTxt.getText().toString());
lossProfitCounterTxt.setText(String.valueOf(profitResult));
}
void dispDate(){
Date c = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd", Locale.getDefault());
}
}
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_barcode_gen);
barcodeGenImg = findViewById(R.id.barcodeGenImg);
QR codeGenImg = findViewById(R.id.QR codeGenImg);
barcodeGenImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent goToBarcodeGen = new
Intent(BarcodeGenActivity.this,BarcodeGen.class);
startActivity(goToBarcodeGen);
}
});
QR codeGenImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent goToQR codeGen = new Intent(BarcodeGenActivity.this, QR
codeGen.class);
startActivity(goToQR codeGen);
}
});
}
}
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
if (editBarNum.getText().toString().trim().length() > 0) {
Integer no = Integer.parseInt(editBarNum.getText().toString());
StringBuilder ans = new StringBuilder();
for (int i = 1; i <= no; i++) {
randomNumGen();
getCode();
saveToInternalDisk();
ans.append(i + "\n");
if (i == no) {
//textLoop.setText(ans);
}
else{
Toast.makeText(getApplicationContext(), "Please fill the blank
text ", Toast.LENGTH_LONG).show();
}
});
}
void barcodeViewId(){
notificationTxt = findViewById(R.id.notificationTxt);
editBarNum =findViewById(R.id.editBarNum);
barGentxt = findViewById(R.id.barGentxt);
barGenImg = findViewById(R.id.barGenImg);
genBarcodeButton = findViewById(R.id.genBarcodeButton);
}
void randomNumGen(){
Random random = new Random();
int number = random.nextInt(1000000000)+1;
barGentxt.setText(String.valueOf(number));
}
private void getCode() {
try{
barcode();
}catch (Exception e)
{
e.printStackTrace();
}
}
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
void saveToInternalDisk(){
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
if (editQRNum.getText().toString().trim().length() > 0) {
Integer no = Integer.parseInt(editQRNum.getText().toString());
StringBuilder ans = new StringBuilder();
for (int i = 1; i <= no; i++) {
randomNumGen();
getCode();
saveToInternalDisk();
ans.append(i + "\n");
if (i == no) {
Toast.makeText(getApplicationContext(), i+" QR code
Image's Saved to Internal Storage", Toast.LENGTH_SHORT).show();
editQRNum.setText("");
notificationQRTxt.setText(i+" QR code Image's generated
successfully,you can get it in internal storage folder name Suqepad");
} else {
}
}
//textLoop.setText(ans);
}
else{
Toast.makeText(getApplicationContext(), "Please fill the blank
text ", Toast.LENGTH_LONG).show();
}
});
}
void barcodeViewId(){
notificationQRTxt = findViewById(R.id.notificationTxt);
editQRNum =findViewById(R.id.editBarNum);
try{
QR code();
}catch (Exception e)
{
e.printStackTrace();
}
}
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
void saveToInternalDisk(){
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.ContactsContract;
import android.widget.Toast;
import androidx.annotation.Nullable;
import java.text.SimpleDateFormat;
//login table
private static final String TABLE_REGISTER = "My_Login";
private static final String COLUMN_1_ID = "_ID";
private static final String COLUMN_2_USER = "username";
private static final String COLUMN_3_PASSWORD = "Password";
//stock data table
private static final String TABLE_STOCK = "My_Stock";
private static final String COL_1_ID = "_IDno";
private static final String COL_2_PROD_NAME = "Product_name";
private static final String COL_3_BARCODE = "Barcode";
private static final String COL_4_DESC = "Description";
private static final String COL_5_CATEGORY = "Category";
private static final String COL_6_PURC_PRICE = "Purchased_Price";
private static final String COL_7_SALE_PRICE = "Sales_Price";
private static final String COL_8_ITEM_STATUS = "Item_Status";
private static final String COL_9_SEPP_NAME = "Supplier_Name";
private static final String COL_10_SEPP_PHONE = "Supplier_phone";
private static final String COL_11_GEN_BAR= "Gen_Barcode";
private static final String COL_12_EXP_DATE= "Exp_Date";
@Override
public void onCreate(SQLiteDatabase db) {
// Create table for registration
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long addUser(String user, String password){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("username", user);
contentValues.put("Password", password);
long result = db.insert(TABLE_REGISTER, null, contentValues);
db.close();
return result;
}
public boolean checkUser(String username, String password){
String[] columns = {COLUMN_1_ID};
SQLiteDatabase db = getReadableDatabase();
String selection = COLUMN_2_USER + "=?" + " and " + COLUMN_3_PASSWORD +
"=?";
String[] selectionArgs = {username, password };
Cursor cursor =
db.query(TABLE_REGISTER,columns,selection,selectionArgs,null,null,null,null);
int count = cursor.getCount();
cursor.close();
db.close();
if(count > 0){
return true;
}else{
return false;
if (db != null) {
cursor = db.rawQuery(query, null);
}
return cursor;
}
cv.put(COL_2_PROD_NAME, product_name_Input);
cv.put(COL_3_BARCODE, addBarcode);
cv.put(COL_4_DESC, description_Input);
cv.put(COL_5_CATEGORY, category_Input);
cv.put(COL_6_PURC_PRICE, purchased_price_Input);
cv.put(COL_7_SALE_PRICE, sales_price_Input);
cv.put(COL_8_ITEM_STATUS, item_status);
cv.put(COL_9_SEPP_NAME, supplier_name_Input);
cv.put(COL_10_SEPP_PHONE, supplier_phone_Input);
// cv.put(COL_11_GEN_BAR, gen_barcode);
cv.put(COL_12_EXP_DATE, exp_date_Input);
if(result == -1) {
Toast.makeText(context, "Failed to add", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "Added Successfully!", Toast.LENGTH_SHORT).show();
Cursor readAllData(){
String query = "SELECT * FROM " + TABLE_STOCK;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if (db != null) {
cursor = db.rawQuery(query, null);
}
return cursor;
}
Cursor readSingleData(long singId){
return cursor;
}
Cursor readSoldData(String categorySold){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " + COL_5_CATEGORY +
" = '"+ categorySold +"' " + "AND " + COL_8_ITEM_STATUS + " = 'Sold'" ;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
}
Cursor readUnsoldData(String categorySold){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " + COL_5_CATEGORY +
" = '"+ categorySold +"' " + "AND " + COL_8_ITEM_STATUS + " = 'available'" ;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
}
Cursor readExpiredData(long currentDate){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " + COL_12_EXP_DATE +
" <= '"+ currentDate +"' " + "AND " + COL_8_ITEM_STATUS + " = 'available'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
}
Cursor readLessThreeData(long currentDate, long fixedDate){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " + COL_12_EXP_DATE +
" >= '"+ fixedDate +"' " + "AND " + COL_8_ITEM_STATUS + " = 'available' " + "AND " +
COL_12_EXP_DATE + " <= '"+ currentDate +"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
}
Cursor readLessSixData(long currentDate, long fixedDate){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " + COL_12_EXP_DATE +
" >= '"+ fixedDate +"' " + "AND " + COL_8_ITEM_STATUS + " = 'available' " + "AND " +
COL_12_EXP_DATE + " <= '"+ currentDate +"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
return cursor;
}
Cursor readProductOutData(){
String query = "SELECT * FROM " + TABLE_STOCK + " WHERE " +
COL_8_ITEM_STATUS + " = 'Sold'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query,null);
return cursor;
}
void updateItem(long statusId) {
SQLiteDatabase db = this.getWritableDatabase();
String query = "UPDATE " + TABLE_STOCK + " SET " + COL_8_ITEM_STATUS + " =
'Sold' "+ "WHERE "+ COL_3_BARCODE + " = '"+ statusId + "'";
db.execSQL(query);
}
void updateAvaliableItem(long statusId) {
SQLiteDatabase db = this.getWritableDatabase();
String query = "UPDATE " + TABLE_STOCK + " SET " + COL_8_ITEM_STATUS + " =
'available' "+ "WHERE "+ COL_3_BARCODE + " = '"+ statusId + "'";
db.execSQL(query);
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_2_PROD_NAME, product_name_Inputtxt);
cv.put(COL_3_BARCODE, addBarcodetxt);
cv.put(COL_4_DESC, description_Inputtxt);
cv.put(COL_5_CATEGORY, category_Inputtxt);
cv.put(COL_6_PURC_PRICE, purchased_price_Inputtxt);
cv.put(COL_7_SALE_PRICE, sales_price_Inputtxt);
cv.put(COL_9_SEPP_NAME, supplier_name_Inputtxt);
cv.put(COL_10_SEPP_PHONE, supplier_phone_Inputtxt);
cv.put(COL_12_EXP_DATE, exp_date_Inputtxt);
Conclusions
To conclude, Daily Stock Controller is simple android based application basically suitable for
small organization. It has every basic items which are used for the small organization. Our team
is successful in making the application where we can add new items, update sold items status,
generate barcode and QR code as per requirement. This application also provides a simple
report on daily basic to know the daily sales and purchase details.
This application matches for small organization where retailer shop’s. Our team believes that
the implementation of the system will surely benefit the organization.
Recommendations
Since this project was started with very little knowledge about the Inventory Management
System, we came to know about the enhancement capability during the process of building it.
Some of the scope we can increase for the betterment and effectiveness are listed below:
Use Firebase database to store data in the cloud this prevents data loss when the phone
lost, broken, or Stolen and also allow multiple users to access database.
Making for IOS phone.
Add backup and restore
Making the system flexible in any type.
Glossary
Reference
https://www.tutorialspoint.com/
https://www.javatpoint.com/
https://en.wikipedia.org/
https://www.workbreakdownstructure.com/
https://creately.com/
https://www.geeksforgeeks.org/
https://stackoverflow.com/