Sunday 27 September 2015

Module 1...Adding email notification on registration

In my last blog (http://productdesignsagain.blogspot.in/2015/09/user-master-data-save-application.html) we made a registration page. Now we will add email notification feature. For this we need to modify 'com.users.controller' package from previous shown project structure:



UserController.java will have a slight modification, it will create object of mail.java on save:

package com.users.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.users.bean.UserBean;
import com.users.model.User;
import com.users.service.UserService;



@Controller
public class UserController {

 @Autowired
 private UserService userService;
 

 @RequestMapping(value = "/save", method = RequestMethod.POST)
 public ModelAndView saveUser( @ModelAttribute("user") UserBean u1, BindingResult result) {
  User u = prepareModel(u1);
  System.out.println("+++++++++++++"+u);
  userService.addUser(u);  

  mail m = new mail(u1.getEmail_id()); // create mail class object
  return new ModelAndView("save");

 }



 @RequestMapping(value = "/welcome", method = RequestMethod.GET)
 public ModelAndView welcome(@ModelAttribute("user") UserBean u1, BindingResult result) {

  System.out.println("1*****************");
  return new ModelAndView("welcome");
 }





 private User prepareModel(UserBean uBean){
  User u1 = new User();
  u1.setPassword(uBean.getPassword());
  u1.setEmail_id(uBean.getEmail_id());
  u1.setUser_id(uBean.getUser_id());
  uBean.setUser_id(null);
  return u1;
 }


}


Mail.java
--------------------------

package com.users.controller;

import java.util.Properties;
import java.util.regex.Pattern;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.xerces.impl.xs.identity.Selector.Matcher;

public class mail {
mail(String m)
{

System.out.println("in mail constructor");
boolean trueBinary = false;
final String username = "< SENDING SERVER ID";
 final String password = "SENDING SERVER PASSWORD";

 String patt = "@(([a-zA-Z0-9_/-/.]+))*.*.";

 Pattern pattern2 =Pattern.compile(patt);
 java.util.regex.Matcher mat = pattern2.matcher(m);
 int count = 0;
    while(mat.find()) {
    System.out.println("found gila bila: " + mat.group(0));
    if(mat.group(0).equals("@gmail.com"))
    {
    System.out.println("gmail");
    trueBinary = true;
   
    }
    else
    trueBinary = false;
    }
   
 if(trueBinary == true)
 {
 Properties props = new Properties();
 props.put("mail.smtp.auth", "true");
 props.put("mail.smtp.starttls.enable", "true");
 props.put("mail.smtp.host", "smtp.gmail.com");
 props.put("mail.smtp.port", "587");

 Session session = Session.getInstance(props,
   new javax.mail.Authenticator() {
     protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(username, password);
     }
   });

 try {

     Message message = new MimeMessage(session);
     message.setFrom(new InternetAddress("SENDING SERVER ID"));
     message.setRecipients(Message.RecipientType.TO,
         InternetAddress.parse(m));
     message.setSubject("Registration Complete");
     message.setText("Dear user you have successfully registered");

     Transport.send(message);

     System.out.println("Done");

 } catch (MessagingException e) {
     throw new RuntimeException(e);
 }


}
 else
 {
 String to = "sento@ta.com";//change accordingly
     String from = "sendfrom@lala.com";
     String host = "localhost";//or IP address

    //Get the session object
     Properties properties = System.getProperties();
     properties.setProperty("mail.smtp.host", host);
     Session session = Session.getDefaultInstance(properties);

    //compose the message
     try{
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setSubject("Ping");
        message.setText("Hello, this is example of sending email  ");

        // Send message
        Transport.send(message);
        System.out.println("message sent successfully....");

     }catch (MessagingException mex) {mex.printStackTrace();}
  }
 }


}

Friday 25 September 2015

Module 1..User Master Data Save application

In this blog, i will be creating user interface to save new user master data in PMS-Users table.

Our end screen should look something like this and should sav data in table post submit:


We are developing this application using Spring 3.2 and are using hibernate for database connection.

Project Structure:


JAR files are same as given in the LIBRARY folder image this link:
http://lillbitofeverythingagain.blogspot.in/2015/07/simple-spring-login.html

web.xml
------------------------

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>sdnext</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/sdnext-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>sdnext</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>welcome.html</welcome-file>
  </welcome-file-list>
</web-app>

Welcome.jsp
------------------------------

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<body>

<h2>New User Master Data</h2>

<form:form method="POST" action="save.html" modelAttribute="user" id="form">

<table>
<tr><td>  <form:input path="user_id" placeholder="User ID:" value="" disabled="true"/></td></tr>

    <tr><td><form:input path="email_id" placeholder="Email ID:" value="" /></td></tr>
<tr> <td> <form:password path="password" placeholder="Password" value="" /> </td></tr>


</table>
<input type="submit" value="Save"/>

</form:form>

</body>


</html>

Controller class
--------------------------------------

package com.users.controller;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.users.bean.UserBean;

import com.users.model.User;
import com.users.service.UserService;


@Controller
public class UserController {

@Autowired
private UserService userService;


@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView saveUser( @ModelAttribute("user") UserBean u1, BindingResult result) {
User u = prepareModel(u1);
System.out.println("+++++++++++++"+u);
userService.addUser(u);
return new ModelAndView("save");
}



@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public ModelAndView welcome(@ModelAttribute("user") UserBean u1, BindingResult result) {

System.out.println("1*****************");
return new ModelAndView("welcome");
}





private User prepareModel(UserBean uBean){
User u1 = new User();
u1.setPassword(uBean.getPassword());
u1.setEmail_id(uBean.getEmail_id());
u1.setUser_id(uBean.getUser_id());
uBean.setUser_id(null);
return u1;
}


}


UserBean.java
-------------------------------

package com.users.bean;
import java.util.Date;

import com.ibm.icu.util.Calendar;

public class UserBean {
private Integer user_id;
private String email_id;
private String password;
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getEmail_id() {
return email_id;
}
public void setEmail_id(String email_id) {
this.email_id = email_id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}


Model class - User.java
-------------------------------------

package com.users.model;

import java.io.Serializable;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="users")
public class User implements Serializable{

private static final long serialVersionUID = -723583058586873479L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "user_id")
private Integer user_id;

public static long getSerialversionuid() {
return serialVersionUID;
}

@Column(name = "email_id")
private String email_id;
@Column(name="password")
private String password;

public Integer getUser_id() {
return user_id;
}

public void setUser_id(Integer user_id) {
this.user_id = user_id;
}

public String getEmail_id() {
return email_id;
}

public void setEmail_id(String email_id) {
this.email_id = email_id;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}





}

UserService.java
------------------------------------
package com.users.service;

import java.util.List;

import com.users.model.User;


public interface UserService {
public void addUser(User user);
}


UserServImpl.java (Implementation of UserService.java)
---------------------------------------------------------------------------------

package com.users.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.users.dao.UserDao;
import com.users.model.User;

@Service("userService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class UserServiceImpl implements UserService {

@Autowired
private UserDao uDao;
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void addUser(User user) {
uDao.addUser(user);
}

}


userDao.java
-------------------------------------

package com.users.dao;

import java.util.List;

import com.users.model.User;

public interface UserDao {
public void addUser(User user);
}


userDaoImpl (implementing userDao interface)
------------------------------------------------------------------------

package com.users.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.users.bean.UserBean;
import com.users.model.User;


@Repository("uDao")
public class UserDaoImpl implements UserDao {

@Autowired
private SessionFactory sessionFactory;
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}



}

package com.users.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.users.bean.UserBean;
import com.users.model.User;


@Repository("uDao")
public class UserDaoImpl implements UserDao {

@Autowired
private SessionFactory sessionFactory;
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}
}
config > sdnext-servlet.xml
-----------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
">

<context:property-placeholder location="classpath:resources/database.properties" />
<context:component-scan base-package="com.users" />
<mvc:annotation-driven/>

<mvc:resources mapping="/js/**" location="/js" />

 <tx:annotation-driven transaction-manager="hibernateTransactionManager"/>  
  <mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="prefixJson" value="true"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="jspViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.user}" />
<property name="password" value="${database.password}" />
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.users.model.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>

<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="webBindingInitializer">
    <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"/>
  </property>
  <property name="messageConverters">
    <list>
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </list>
  </property>
</bean>

</beans>

Save,jsp
------------------------

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>  
<body>  
<% out.print("data saved."); %>  
</body>  
</html>

resources- database.properties
----------------------------------------------

database.driver=org.postgresql.Driver
database.url=jdbc:postgresql://localhost:5432/PMS
database.user=postgres
database.password=12345
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create

Now export WAR file to webapps folder in apache folder, deploy and run..

Save the data in the screen and database has the data:


Message post saving:

Data in table post saving:



Thursday 10 September 2015

Module 1 - "Roles and Users" table design..continued

In this blog, i will write down the queries to create database and tables. We are using postgres.

Refer my previous blog to understand the table design:
http://productdesignsagain.blogspot.com/2015/09/module-1-roles-and-users-database-design.html

Create database "PMS" :

CREATE DATABASE "PMS"
  WITH OWNER = "PMS"
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'en_US'
       LC_CTYPE = 'en_US'
       CONNECTION LIMIT = -1;

COMMENT ON DATABASE "PMS"
  IS 'Database for Independent Pharma Management System application developed by Ruach's Tsidkenu LTD';

Next, create table "roles"
-------------------------------------
CREATE TABLE roles
(
  role_id serial NOT NULL,
  read character varying(1) NOT NULL,
  insert character varying(1) NOT NULL,
  modify character varying(1) NOT NULL,
  CONSTRAINT roles_pkey PRIMARY KEY (role_id),
  CONSTRAINT roles_insert_check CHECK (insert::text = ANY (ARRAY['Y'::character varying, 'N'::character varying]::text[])),
  CONSTRAINT roles_modify_check CHECK (modify::text = ANY (ARRAY['Y'::character varying, 'N'::character varying]::text[])),
  CONSTRAINT roles_read_check CHECK (read::text = ANY (ARRAY['Y'::character varying, 'N'::character varying]::text[]))

******Add CHECK constraint to limit the entry to 'Y' and 'N' values only.********

)
WITH (
  OIDS=FALSE
);

INSERT INTO roles(READ,INSERT,MODIFY) VALUES('Y','Y','Y');
INSERT INTO roles(READ,INSERT,MODIFY) VALUES('Y','Y','N');

SELECT * FROM roles



Create table "users"
--------------------------
CREATE TABLE users (
user_id SERIAL,
password varchar(10) NOT NULL,
email_id varchar(30) NOT NULL,
create_date TIMESTAMP ,
-- /*not including this column yet */modify_date TIMESTAMP ,
PRIMARY KEY (user_id)
);

****Write a procedure to auto update columns 'create_date' and 'modify_date' after insert or update of a column in table 'users'. NOTE: column 'create_date' is modified only the first time it is created.******

Procedure:

CREATE OR REPLACE FUNCTION after_insert_update()
RETURNS TRIGGER
AS $BODY$ BEGIN
        UPDATE users
        SET create_date = CASE -- if coulumn 'create_date' is empty then update it's value
WHEN create_date IS NULL
THEN current_timestamp

END,
  modify_date = current_timestamp
--****** column 'modify_date' is updated each time user record is updated*****
WHERE user_id = new.user_id;
RETURN NEW;
 END;
$BODY$ LANGUAGE plpgsql;

Trigger: Create 2 triggers:
1. To run after insertion.
2. To run after updation.

Both triggers use common procedure 'after_insert_update()':

CREATE TRIGGER insert_trigger AFTER INSERT ON users
FOR EACH ROW EXECUTE PROCEDURE after_insert_update();

-- not including this trigger yet,, /*CREATE TRIGGER update_trigger AFTER UPDATE ON users
--FOR EACH ROW EXECUTE PROCEDURE after_insert_update();
---yet,, keeping only 1 trigger */

Create table "modules"
-----------------------------------
CREATE TABLE modules (
module_id SERIAL,
module_name varchar(30) UNIQUE,
user_id INTEGER NOT NULL references users(user_id),
role_id INTEGER NOT NULL references roles(role_id),
PRIMARY KEY (module_id)
);



Wednesday 9 September 2015

Module 1 - "Roles and Users" table design


So let's get started with our application, shall we?

In upcoming blogs i will be giving a lot of links from where you will need to download resources - for example you will need to download bootstrap soon. But before any of business logic or view design, its crucial to design database and the first few tables will be for user logins as in this diagram:




As the diagram is self-explanatory - There are going to be 2 primary tables.

Roles table will store roles privilege information.
Users table will store user information
Module table will be common to all Modules and users which will store module level privilege information for each user.

You can choose any database here. I changed my mind and i will be using postgres instead.

Friday 4 September 2015

Installations

Hi,

Before starting my series of blogs on how to design an e-pharma system, it would be a great idea if you could install whatever is required. I'm just enlisting them here:

Workbench for java-applications:


JDK & JRE:
http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp
Guide:
http://docs.oracle.com/javase/7/docs/webnotes/install/

Kindly, check in your Control Panel, if you have MySQL server installed already. If not, then you can try this:

http://dev.mysql.com/downloads/mysql/


For Eclipse IDE:
https://www.eclipse.org/downloads/packages/release/indigo/sr2

Installation guide for Eclipse:
http://www.homeschoolprogramming.com/support/docs/instructions/Eclipse_Indigo_Install_Instructions_Win.pdf

You could install NetBeans also, which in this case can work as an alternative for Eclipse:

https://netbeans.org/downloads/

Installation guide:
https://netbeans.org/community/releases/36/install.html

Database, MySQL:

Can you google MySQL front and see which one suits you according to your operating system an then install it?


MySQL JDBC JAR (we need this file to be there for connectivity):

http://dev.mysql.com/downloads/connector/j/5.0.html







Wednesday 2 September 2015

Building stand-alone and online e-pharma product

So hello there!

Hope you have at-least begun to think that you can program if you want to.

Now, honestly I will not cover the basic basics on my blogs, reason being there are many resources available online, fool-proof and have been published with much research. Get hold of them.
Google as many materials you can.

But what I am trying to do is to build practical applications with you using those basics. What i will do is give you a road-map on how to go through the basics.  


How to go about Basics:
Do you read novels? Like when I was reading The Bible for the first time, i couldnt understand much. So  I read it abstractly for the 1st time and did not try to understand it deeply. But the 2nd time it made more sense because I knew what was coming. Now it makes more sense each time. 

Likewise, in any subject, go through the basics and their examples abstractly – 1 full cycle of contents. Then get deeper on your 2nd read and so forth.


PRODUCT GOAL: We are going to make “e-pharma” system . This system will capture all vital business transactions of an independent pharmacy. When I say independent pharmacy, I am talking about a  pharmacy which is not a sub-unit of any hospital and where you don’t need to register yourself as any patient to get medicines but you can simply buy them on legitimate medical prescriptions.


PRODUCT TYPES:
1.      Stand-alone e-pharma
2.      Online e-pharma

Stand-alone e-pharma: 
In Stand-alone applications you have database on your own personal system, your system acts like server and client. (Please see my post on simple java app, to understand server and client architecture, also google other resources too to understand it).

In standalone system, your database (tables, information) , is stored in your own system. All the Screens to store information are run on your personal PC without internet.

We will use Swing, JDBC and MySQL to build standalone.


Web/Online e-pharma: Here all your information is not necessarily stored on your personal system, it could be stored on a remote server and you could be calling them through your personal system, like online booking.

We will use Servlets, JDBC, java, JSP, Spring, Hibernate to build online e-pharma.


Helpful links to learn the basics of these languages:

JAVA:


Apart from them, I personally really like Java for Students by Ajay Pherwani. You don’t have to be a student to buy this book neither feel that you are too old to read it. I personally used this book to start with java and now use it time and again to brush up my basics.


MySQL and RDBMS


Google and download different PDFs and PPTs to understand RDBMS, (Relational Database Management System).

Like wise google as many. I  personally use the book “The Complete Reference MySQL” .


JSP (Java Server Pages)

Google as many links as you can.
Book - Complete Reference, TATA McGraw Hill.

----------------------------------------------------------------------------
Make a plan and go through them abstractly for 1st time. Don’t get discouraged if you don’t understand. I personally did not understand them for first time even though I am an IT graduate. So don’t get discouraged, but practice and get deeper each time you read and practice them.

ROAD MAP to building e-pharma:

Database Designing is common for stand-alone and web e-pharma, so we will use 1 database for both the systems.
So our 1st step would be to design Database for e-pharma.
And the second step, would be to create screens for both – stand-alone and web e-pharma.

So get yourself prepared to build a real system. My next blog is on e-pharma database designing. We will be creating an RDBMS (which you will find out if you go through the tutorials I have recommended or else google it).
Following database design, will be designing transaction and Master screens (I will explain the difference in upcoming blogs).

Thankyou.








Brainstorm Sales Order flow with me...

General Flow:

Customers broadcast a purchase quotation for a list of product/service they require. A finalized  quotation(on price and quantity) converts to Purchase order which when finalized converts to sales order then  Delivery Order and then Delivery Acceptance. Each phase/module in the flow is linked to Document Management System. Document management system holds mandatory documents relevant to each phase(eg: Bill of Lading, Receipt, etc). Each purchase and sales order should also be linked to inventory system which notifies or forecasts available amount. In case of a manufacturing company, this is linked to Bill Of Materials which help monitor child and parent products.

Starting with Purchase Quotation, each screen has a "Convert to.." button, which on pressing automatically passes details from current phase to next phase.

NOTE: Line items are in editable mode in quotation phase.

Purchase Quotation:



Note: Depending on  business rule, PO can have editable or non-editable line items. In this diagram i have kept it non-editable(shaded in blue).

Purchase Order:


Sales Order:


Delivery Order:


Delivery Acceptance:


What's this blog about anyways?

Well, here i will be discussing product design details. It's simple - what i think - i jot down.


Functional specification of a business flow to database design of my amateur product and actual projects. Lets see how this crystallizes. Honestly, i would love your contribution.