A company is supplying 5 types of soft drinks like Pepsi, Sprite, Orange Soda, Cherry Soda and a new lemon drink to different stores. The company has a new promotion which gives a free dozen of lemon drink and free dozen of cherry drink for every 24 dozen of Pepsi, for every 30 dozen of Sprite and every 10 dozen of Orange Soda. The company provides many discounts on their sales which can be listed as follows:-

2% discount if sale >=$15,000
3% discount if sale>=$20,000
2% additional discount if the bill is paid within 30 days
10 dozens of free lemon drinks extra if the total purchased is>= $25,000.
Write a program in java to read the order for the number and type of soft drinks, soda cost, and shipping and handling cost, date of invoice, payment date. Then compute the total discount, total number dozens of soda, total number of free soda received, shipping cost, and total cost. Use String tokenizer and buffering. Must document the program and provide the processing phase of the program.
For this problem, use the following data
5000 doz Pepsi
4000 doz Sprite
7500 doz Orange Soda
$1.50 per dozen
$0.25 shipping cost per dozen.

Here is a step-by-step solution to the problem:

Step 1: Declare variables and read input
- Declare variables to store the quantities of each soft drink, the cost per dozen, the shipping cost per dozen, the total number of dozens of soda, the total number of free soda received, the shipping cost, the total cost, and the invoice and payment dates.
- Read the quantities of each soft drink, the soda cost, the shipping cost, the invoice date, and the payment date.

Step 2: Calculate total number of dozens of soda
- Add the quantities of all five types of soft drinks to get the total number of dozens of soda.

Step 3: Calculate total number of free soda received
- Divide the quantity of Pepsi by 24 to get the number of dozens eligible for the promotion.
- Multiply this number by 2 to get the number of dozens of cherry drink received.
- Multiply this number by 12 to convert it to individual bottles.

Step 4: Calculate shipping cost
- Multiply the total number of dozens of soda by the shipping cost per dozen to get the shipping cost.

Step 5: Calculate total cost
- Multiply the total number of dozens of soda by the soda cost to get the cost of the soda.
- Add the shipping cost to get the total cost.

Step 6: Calculate discounts
- Check if the total cost is greater than or equal to $15,000. If true, apply a 2% discount.
- Check if the total cost is greater than or equal to $20,000. If true, apply an additional 3% discount.
- Check if the invoice date is within 30 days of the payment date. If true, apply an additional 2% discount.

Step 7: Add additional free lemon drinks
- Check if the total cost is greater than or equal to $25,000. If true, add 10 dozens of free lemon drinks.

Step 8: Print the results
- Print the total discount, total number of dozens of soda, total number of free soda received, shipping cost, and total cost.

Here is the Java code implementing the above steps:

```java
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class SoftDrinkOrder {
public static void main(String[] args) {
// Step 1: Declare variables and read input
int pepsiQty = 5000;
int spriteQty = 4000;
int orangeQty = 7500;
double sodaCost = 1.50;
double shippingCostPerDozen = 0.25;
int totalDozens = pepsiQty + spriteQty + orangeQty;
int freeSodaReceived = 0;
double shippingCost = 0.0;
double totalCost = 0.0;
double discount = 0.0;
String invoiceDate = "2022-01-01";
String paymentDate = "2022-01-31";

// Step 2: Calculate total number of dozens of soda
// - Already calculated in the variable totalDozens

// Step 3: Calculate total number of free soda received
freeSodaReceived = (pepsiQty / 24) * 2 * 12;

// Step 4: Calculate shipping cost
shippingCost = totalDozens * shippingCostPerDozen;

// Step 5: Calculate total cost
totalCost = (totalDozens * sodaCost) + shippingCost;

// Step 6: Calculate discounts
if (totalCost >= 15000) {
discount += (totalCost * 0.02);
}

if (totalCost >= 20000) {
discount += (totalCost * 0.03);
}

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date invoice = sdf.parse(invoiceDate);
Date payment = sdf.parse(paymentDate);

if ((payment.getTime() - invoice.getTime()) / (1000 * 60 * 60 * 24) <= 30) {
discount += (totalCost * 0.02);
}
} catch (ParseException e) {
e.printStackTrace();
}

// Step 7: Add additional free lemon drinks
if (totalCost >= 25000) {
freeSodaReceived += (10 * 12);
}

// Step 8: Print the results
System.out.println("Total Discount: $" + discount);
System.out.println("Total Number of Dozens of Soda: " + totalDozens);
System.out.println("Total Number of Free Soda Received: " + freeSodaReceived);
System.out.println("Shipping Cost: $" + shippingCost);
System.out.println("Total Cost: $" + (totalCost - discount));
}
}
```

Note: This code assumes that the system date and time are correct, and the invoice and payment dates are provided in the format yyyy-MM-dd. Make sure to modify the code to read the input from the user or any other source as required.

To solve this problem in Java, you can follow these steps:

1. Begin by importing the necessary packages:
```java
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
```

2. Create a main function to start the program execution:
```java
public static void main(String[] args) {
// Enter the code here
}
```

3. Start by declaring variables to store the order details and costs:
```java
int pepsidoz, spritedoz, orangedoz;
int pepsiPromo, spritePromo, orangePromo;
int lemonPromo, cherryPromo;
double pepsiPrice, spritePrice, orangePrice;
double shippingCost, totalDiscount, totalCost;
String orderDate, paymentDate;
```

4. Prompt the user to input the order details using the Scanner class:
```java
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the number of dozens of Pepsi: ");
pepsidoz = scanner.nextInt();

System.out.print("Enter the number of dozens of Sprite: ");
spritedoz = scanner.nextInt();

System.out.print("Enter the number of dozens of Orange Soda: ");
orangedoz = scanner.nextInt();

scanner.nextLine(); // Clear the input buffer

System.out.print("Enter the order date (yyyy-mm-dd): ");
orderDate = scanner.nextLine();

System.out.print("Enter the payment date (yyyy-mm-dd): ");
paymentDate = scanner.nextLine();

scanner.close(); // Close the scanner
```

5. Calculate the promotion values based on the order quantities:
```java
pepsiPromo = pepsidoz / 24;
spritePromo = spritedoz / 30;
orangePromo = orangedoz / 10;

lemonPromo = Math.min(pepsiPromo, Math.min(spritePromo, orangePromo));
cherryPromo = pepsiPromo;
```

6. Calculate the total number of dozens of sodas and the total number of free sodas:
```java
int totalDozens = pepsidoz + spritedoz + orangedoz;
int totalFreeSodas = 12 * (lemonPromo + cherryPromo);
```

7. Calculate the total cost by multiplying the number of dozens by the price:
```java
pepsiPrice = 1.5;
spritePrice = 1.5;
orangePrice = 1.5;

double totalSodaCost = (pepsiPrice * pepsidoz) + (spritePrice * spritedoz) + (orangePrice * orangedoz);
```

8. Calculate the shipping cost based on the number of dozens:
```java
shippingCost = 0.25 * totalDozens;
```

9. Calculate the total discount according to the given conditions:
```java
totalDiscount = 0;

if (totalSodaCost >= 15000) {
totalDiscount += totalSodaCost * 0.02;
}

if (totalSodaCost >= 20000) {
totalDiscount += totalSodaCost * 0.03;
}

if (paymentDate.equals(orderDate) || paymentDate.equals(orderDate + 30 days)) {
totalDiscount += totalSodaCost * 0.02;
}
```

10. Finally, calculate the total cost by subtracting the total discount from the total soda cost and adding the shipping cost:
```java
totalCost = totalSodaCost - totalDiscount + shippingCost;
```

11. Print the results:
```java
System.out.println("Total number of dozens of soda: " + totalDozens);
System.out.println("Total number of free sodas received: " + totalFreeSodas);
System.out.println("Shipping cost: $" + shippingCost);
System.out.println("Total cost: $" + totalCost);
```

This is a basic outline of how you can solve this problem in Java. The code provided assumes that you'll be using command-line input for simplicity. You can modify it as needed to fit your specific requirements or desired input/output format.