GIN-OnSuccess

PHOTO EMBED

Tue Jan 07 2025 14:36:50 GMT+0000 (Coordinated Universal Time)

Saved by @Pooja

// GIN num generation
try 
{
	input.Status = "Open";
	for each  rec in input.Item_Details
	{
		rec.Status=input.Status;
	}
	var = 0;
	if(input.GIN_Number.trim().len() < 1)
	{
		var = 1;
		str = thisapp.Common.Number_Function_New("Goods Issued Note");
		input.GIN_Number = str;
	}
	//as per the advice from Mr.senthil dt 05/1/2024 in stock values form reduce the stockqty based on FIFO method(added time)
	for each  itdrec in input.Item_Details
	{
		getstkvalue = Stock_Value[Part_No == itdrec.Part_No && Stock_Qty > 0] sort by Added_Time asc;
		if(getstkvalue.count() > 0)
		{
			svbalqty = 0;
			svi = 1;
			for each  stokvalrec in getstkvalue
			{
				//Issued Quantiy is less total qty
				if(itdrec.Issued_Quantity <= stokvalrec.Stock_Qty && svi == 1)
				{
					stokvalrec.Stock_Qty=ifnull(itdrec.Qty_after_Issued,0.0);
					stokvalrec.Stock_Value=ifnull(itdrec.Rate,0.0) * ifnull(itdrec.Qty_after_Issued,0.0);
					stokvalrec.Inventory_Qty=ifnull(itdrec.Qty_after_Issued,0.0);
				}
				//Issued Quantity is more total qty
				else if(itdrec.Issued_Quantity > stokvalrec.Stock_Qty && svi == 1)
				{
					svbalqty = ifnull(itdrec.Issued_Quantity,0.0) - ifnull(stokvalrec.Stock_Qty,0.0);
					stokvalrec.Stock_Qty=0;
					stokvalrec.Stock_Value=0;
					stokvalrec.Inventory_Qty=0;
				}
				//for first time it should not get inside the loop 
				if(svbalqty > 0 && svi > 1)
				{
					//Balance Qty is less 
					if(svbalqty <= stokvalrec.Stock_Qty)
					{
						stokvalrec.Stock_Qty=ifnull(stokvalrec.Stock_Qty,0.0) - ifnull(svbalqty,0.0);
						stokvalrec.Stock_Value=ifnull(stokvalrec.Unit_Price,0.0) * ifnull(stokvalrec.Stock_Qty,0.0);
						stokvalrec.Inventory_Qty=ifnull(stokvalrec.Inventory_Qty,0.0) - ifnull(svbalqty,0.0);
						svbalqty = 0;
					}
					//Balance Qty is More
					else if(svbalqty >= stokvalrec.Stock_Qty)
					{
						svbalqty = ifnull(svbalqty,0.0) - ifnull(stokvalrec.Stock_Qty,0.0);
						stokvalrec.Stock_Qty=0;
						stokvalrec.Stock_Value=0;
						stokvalrec.Inventory_Qty=0;
					}
				}
				if(svbalqty == 0)
				{
					info "before break";
					break;
				}
				svi = svi + 1;
			}
		}
		else if(getstkvalue.count() == 0)
		{
			insert into Stock_Value
			[
				Added_User=zoho.loginuser
				Part_No=itdrec.Part_No
				Part_Description=itdrec.Part_Description
				Specification=itdrec.Specification
				Stock_Qty=ifnull(itdrec.Qty_after_Issued,0.0)
				Unit_Price=ifnull(itdrec.Rate,0.00)
				Stock_Value=ifnull(itdrec.Rate,0.00) * ifnull(itdrec.Qty_after_Issued,0.00)
				Inventory_Qty=ifnull(itdrec.Qty_after_Issued,0.0)
			]
		}
	}
	// //insert the part no if not available in stock value form.the below comment and new code is above on 5/1/2024
	/*for each  stkvalrec in input.Item_Details
{
	getinvent = Inventory[Part_No == stkvalrec.Part_No && Total_Qty > 0];
	if(getinvent.count() > 0)
	{
		fet_stockvalue = Stock_Value[Part_No == stkvalrec.Part_No && Unit_Price == stkvalrec.Rate];
		if(fet_stockvalue.count() == 0)
		{
			insert into Stock_Value
			[
				Added_User=zoho.loginuser
				Part_No=stkvalrec.Part_No
				Part_Description=stkvalrec.Part_Description
				Specification=stkvalrec.Specification
				Location_Name=getinvent.Location_Name
				Sub_Location=getinvent.Sub_Location
				Rack_Number=getinvent.Rack_Number
				Warehouse=getinvent.Warehouse
				Stock_Qty=ifnull(stkvalrec.Qty_after_Issued,0.0)
				Unit_Price=ifnull(stkvalrec.Rate,0.00)
				Stock_Value=ifnull(stkvalrec.Rate,0.00) * ifnull(stkvalrec.Qty_after_Issued,0.00)
				Inventory_Qty=ifnull(stkvalrec.Qty_after_Issued,0.0)
			]
		}
		else if(fet_stockvalue.count() > 0)
		{
			fet_stockvalue = Stock_Value[Part_No == stkvalrec.Part_No && Unit_Price == stkvalrec.Rate];
			if(fet_stockvalue.Stock_Qty > 0)
			{
				fet_stockvalue.Stock_Qty=ifnull(fet_stockvalue.Stock_Qty,0.0) - ifnull(stkvalrec.Issued_Quantity,0.0);
				fet_stockvalue.Stock_Value=ifnull(stkvalrec.Rate,0.0) * ifnull(fet_stockvalue.Stock_Qty,0.0);
				fet_stockvalue.Inventory_Qty=ifnull(fet_stockvalue.Stock_Qty,0.0);
			}
			else
			{
				fet_stockvalue.Stock_Qty=ifnull(stkvalrec.Qty_after_Issued,0.0);
				fet_stockvalue.Stock_Value=ifnull(stkvalrec.Rate,0.0) * ifnull(stkvalrec.Qty_after_Issued,0.0);
				fet_stockvalue.Inventory_Qty=ifnull(stkvalrec.Qty_after_Issued,0.0);
			}
		}
	}
}*/
	//
	if(input.Form_Mode == "GIN against WO")
	{
		iss_qty = 0;
		ava_qty = 0;
		bal_qty = 0;
		for each  wovar in input.Item_Details
		{
			getinv = Inventory[Part_No == wovar.Part_No && Location_Name.Location__Name == "Production WIP" && Sub_Location.Sub_Location == "Paint Shop"];
			getin = Inventory[Part_No == wovar.Part_No && Location_Name.Location__Name != "Production WIP" && Total_Qty > 0] sort by Total_Qty desc;
			// 			sendmail
			// 			[
			// 				from :zoho.loginuserid
			// 				to :"pooja.s@synprosoft.com","parthasarathy.m@synprosoft.com"
			// 				subject :"GIN Successful form submission - getinV"
			// 				message :"Part No " + getin.Part_No.Part_No + "PRD WIP TOT QTY-" + getinv.Total_Qty + "PRD WIP AVL QTY-" + getinv.Available_Qty + "PRD WIP BLK QTY-" + getinv.Block_Qty + "ID-" + getin.ID + "getinv insert Count-" + getinv.count() + "NOPRDWIP TQ " + getin.Total_Qty + "noprdwip aq " + getin.Available_Qty + "noprd blkqty " + getin.Block_Qty
			// 			]
			if(getin.count() > 0)
			{
				//Block is greater than Issue qty
				if(getin.Block_Qty >= wovar.Issued_Quantity && getin.Block_Qty > 0)
				{
					getin.Block_Qty=ifnull(getin.Block_Qty,0) - ifnull(wovar.Issued_Quantity,0);
					getin.Total_Qty=ifnull(getin.Total_Qty,0) - ifnull(wovar.Issued_Quantity,0);
				}
				else if(getin.Block_Qty < wovar.Issued_Quantity && getin.Block_Qty > 0)
				{
					bal = ifnull(wovar.Issued_Quantity,0) - ifnull(wovar.Block_Qty,0);
					blk = ifnull(wovar.Block_Qty,0);
					getin.Available_Qty=ifnull(getin.Available_Qty,0) - bal;
					getin.Total_Qty=ifnull(getin.Total_Qty,0) - ifnull(wovar.Issued_Quantity,0);
					getin.Block_Qty=0;
				}
				else if(getin.Block_Qty == 0 || getin.Block_Qty == null)
				{
					if(getin.Available_Qty > 0 && getin.Available_Qty >= wovar.Issued_Quantity)
					{
						getin.Available_Qty=ifnull(getin.Available_Qty,0) - wovar.Issued_Quantity;
						getin.Total_Qty=ifnull(getin.Total_Qty,0) - ifnull(wovar.Issued_Quantity,0);
					}
					if(getin.Available_Qty > 0 && getin.Available_Qty < wovar.Issued_Quantity)
					{
						getin.Available_Qty=wovar.Issued_Quantity - ifnull(getin.Available_Qty,0);
						getin.Total_Qty=ifnull(wovar.Issued_Quantity,0) - ifnull(getin.Total_Qty,0);
					}
				}
			}
			if(getinv.count() == 0)
			{
				bal = 0;
				if(wovar.Issued_Quantity > wovar.Block_Qty && getin.Available_Qty > 0)
				{
					bal = ifnull(wovar.Issued_Quantity,0) - ifnull(wovar.Block_Qty,0);
					getin.Block_Qty=0;
					getin.Available_Qty=ifnull(getin.Available_Qty,0) - bal;
					getin.Total_Qty=ifnull(getin.Available_Qty,0);
				}
				if(wovar.Issued_Quantity > wovar.Required_Quantity)
				{
					blk = ifnull(wovar.Issued_Quantity,0) - ifnull(wovar.Required_Quantity,0);
					ins = insert into Inventory
					[
						Part_Description=wovar.Part_Description
						Part_No=wovar.Part_No
						Total_Qty=wovar.Required_Quantity
						Available_Qty=wovar.Issued_Quantity
						Block_Qty=blk
						UOM=wovar.Unit_of_Measurement
						Location_Name=143536000004382382
						Sub_Location=143536000004382454
						Added_User=zoho.loginuser
					];
				}
				else if(wovar.Issued_Quantity == wovar.Required_Quantity)
				{
					ins1 = insert into Inventory
					[
						Part_Description=wovar.Part_Description
						Part_No=wovar.Part_No
						Total_Qty=wovar.Required_Quantity
						Available_Qty=wovar.Issued_Quantity
						Block_Qty=0
						UOM=wovar.Unit_of_Measurement
						Location_Name=143536000004382382
						Sub_Location=143536000004382454
						Added_User=zoho.loginuser
					];
				}
				else if(wovar.Issued_Quantity < wovar.Required_Quantity)
				{
					ins2 = insert into Inventory
					[
						Part_Description=wovar.Part_Description
						Part_No=wovar.Part_No
						Total_Qty=wovar.Required_Quantity
						Available_Qty=wovar.Issued_Quantity
						Block_Qty=wovar.Balance_Quantity
						UOM=wovar.Unit_of_Measurement
						Location_Name=143536000004382382
						Sub_Location=143536000004382454
						Added_User=zoho.loginuser
					];
				}
			}
			else if(getinv.count() > 0)
			{
				sendmail
				[
					from :zoho.loginuserid
					to :"pooja.s@synprosoft.com"
					subject :"GIN Successful form submission - getinV"
					message :"Part No " + getin.Part_No.Part_No + "PRD WIP TOT QTY-" + getinv.Total_Qty + "PRD WIP AVL QTY-" + getinv.Available_Qty + "PRD WIP BLK QTY-" + getinv.Block_Qty + "ID-" + getin.ID + "getinv insert Count-" + getinv.count()
				]
				if(wovar.Required_Quantity == wovar.Issued_Quantity)
				{
					getinv.Available_Qty=ifnull(getinv.Available_Qty,0) + ifnull(wovar.Issued_Quantity,0);
					getinv.Total_Qty=ifnull(getinv.Total_Qty,0) + ifnull(wovar.Issued_Quantity,0);
				}
				//When Issued Qty is Greater than Reqquired Qty
				else if(wovar.Issued_Quantity > wovar.Required_Quantity)
				{
					// 					blk = ifnull(wovar.Issued_Quantity,0) - ifnull(wovar.Required_Quantity,0);
					// 					getinv.Total_Qty=ifnull(getinv.Total_Qty,0) + ifnull(wovar.Required_Quantity,0);
					// 					getinv.Available_Qty=ifnull(getinv.Available_Qty,0) + ifnull(wovar.Issued_Quantity,0);
					// 					getinv.Block_Qty=ifnull(getinv.Block_Qty,0) + blk;
					blk = ifnull(wovar.Issued_Quantity,0) + ifnull(wovar.Required_Quantity,0);
					getinv.Total_Qty=ifnull(getinv.Total_Qty,0) + blk;
					getinv.Available_Qty=ifnull(getinv.Available_Qty,0) + ifnull(wovar.Issued_Quantity,0);
					getinv.Block_Qty=ifnull(getinv.Block_Qty,0) + ifnull(wovar.Required_Quantity,0);
				}
				else if(wovar.Issued_Quantity < wovar.Required_Quantity)
				{
					getinv.Total_Qty=ifnull(getinv.Total_Qty,0) + ifnull(wovar.Required_Quantity,0);
					getinv.Available_Qty=ifnull(getinv.Available_Qty,0) + ifnull(wovar.Issued_Quantity,0);
					getinv.Block_Qty=ifnull(getinv.Block_Qty,0) + ifnull(wovar.Balance_Quantity,0);
				}
			}
			mat_isf_qty = ifnull(wovar.Issued_Quantity,0) + ifnull(wovar.Quantity_issued_so_far,0);
			fetch_mat_subform = Material_Request_Subform[ID == wovar.Material_Request_Subform_lu && Part_Description == wovar.Part_Description];
			fetch_mat_subform.Quantity_issued_so_far=mat_isf_qty;
			blnc_qty = ifnull(wovar.Balance_Quantity,0.0);
			fetch_mat_subform.Balance_Qty=blnc_qty;
			bat_no_list = List();
			iss_qty = wovar.Issued_Quantity;
			bat = Stock_Batch[Part_No == wovar.Part_No && Part_Description == wovar.Part_Description && Status != "Issued" && Location == wovar.Location && Warehouse == input.Warehouse && Sub_Location == wovar.Sub_Location && Racks_Bins == wovar.Racks_Bins];
			for each  i1 in bat
			{
				bat_no = Stock_Batch[ID == i1].Batch_No;
				bat_no_list.add(bat_no);
			}
			i = 0;
			for each  no in bat_no_list
			{
				batching = Stock_Batch[Batch_No == no];
				ava_qty = batching.Available_Quantity;
				i = i + 1;
				if(i == 1 && iss_qty > ava_qty)
				{
					batching.Status="Issued";
					batching.Issued_Qty_So_far=iss_qty;
					batching.Available_Quantity=0;
					bal_qty = iss_qty - ava_qty;
				}
				else if(i == 1 && iss_qty < ava_qty)
				{
					batching.Status="Partially Issued";
					batching.Issued_Qty_So_far=iss_qty;
					batching.Available_Quantity=ava_qty - iss_qty;
					bal_qty = 0;
				}
				else if(i == 1 && iss_qty == ava_qty)
				{
					batching.Status="Issued";
					batching.Issued_Qty_So_far=iss_qty;
					batching.Available_Quantity=0;
					bal_qty = 0;
				}
				else if(i > 1 && bal_qty > ava_qty)
				{
					batching.Status="Issued";
					batching.Issued_Qty_So_far=iss_qty;
					batching.Available_Quantity=0;
					bal_qty = bal_qty - ava_qty;
				}
				else if(i > 1 && bal_qty < ava_qty)
				{
					batching.Status="Partially Issued";
					batching.Issued_Qty_So_far=iss_qty;
					batching.Available_Quantity=ava_qty - bal_qty;
					bal_qty = 0;
				}
				else if(i > 1 && bal_qty == ava_qty)
				{
					batching.Status="Issued";
					batching.Issued_Qty_So_far=bal_qty;
					batching.Available_Quantity=0;
					bal_qty = 0;
				}
			}
			// Updating Stock value
			temp_issued_qty = rec.Issued_Quantity;
			ival = 0;
			bal = 0;
			if(wovar.Balance_Quantity < 1)
			{
				fetch_mat_subform.Status="Issued";
			}
			else
			{
				fetch_mat_subform.Status="Partially Issued";
			}
		}
	}
	//above closing parenthesis is for gin from work order if contidion.
	emptylist = List();
	if(Material_Request_RECID != emptylist || Material_Request_RECID != null && input.Form_Mode == "GIN against MRQ")
	{
		fet_Mrq_sts = Material_Request[ID == input.Material_Request_RECID];
		//For GIN Validtaions
		for each  rec in input.Item_Details
		{
			if(rec.Issued_Quantity != null || rec.Issued_Quantity != 0)
			{
				//Updating qty issued so far
				mat_isf_qty = ifnull(rec.Issued_Quantity,0) + ifnull(rec.Quantity_issued_so_far,0);
				//Updating Quantity_issued_so_far in Material Request Subform
				fetch_mat_subform = Material_Request_Subform[ID == rec.Material_Request_Subform_lu && Part_Description == rec.Part_Description];
				fetch_mat_subform.Quantity_issued_so_far=mat_isf_qty;
				//Updating blnc qty
				blnc_qty = ifnull(rec.Balance_Quantity,0.0);
				fetch_mat_subform.Balance_Qty=blnc_qty;

				//below is new code to handle when items are in multiple times with different places.
				getinventory = Inventory[Part_No == rec.Part_No] sort by Total_Qty desc;
				info getinventory;
				if(getinventory.count() > 0)
				{
					balqty = 0;
					i = 1;
					for each  inventrec in getinventory
					{
						info balqty;
						info i;
						//Issued Quantiy is less total qty
						if(rec.Issued_Quantity <= inventrec.Total_Qty && i == 1)
						{
							info "issued qty is less than total qty";
							inventrec.Total_Qty=ifnull(inventrec.Total_Qty,0.0) - ifnull(rec.Issued_Quantity,0.0);
							inventrec.Available_Qty=ifnull(inventrec.Available_Qty,0.0) - ifnull(rec.Issued_Quantity,0.0);
						}
						//Issued Quantity is more total qty
						else if(rec.Issued_Quantity > inventrec.Total_Qty && i == 1)
						{
							info "issued qty is more than total qty";
							balqty = ifnull(rec.Issued_Quantity,0.0) - ifnull(inventrec.Total_Qty,0.0);
							inventrec.Total_Qty=0;
							inventrec.Available_Qty=0;
						}
						//for first time it should not get inside the loop 
						if(balqty > 0 && i > 1)
						{
							info "balaance qty is more than zero";
							//Balance Qty is less 
							if(balqty <= inventrec.Total_Qty)
							{
								info "balance qty is less than total qty";
								inventrec.Total_Qty=ifnull(inventrec.Total_Qty,0.0) - ifnull(balqty,0.0);
								inventrec.Available_Qty=ifnull(inventrec.Available_Qty,0.0) - ifnull(balqty,0.0);
								balqty = 0;
							}
							//Balance Qty is More
							else if(balqty >= inventrec.Total_Qty)
							{
								info "balance qty is greater than total qty";
								balqty = ifnull(balqty,0.0) - ifnull(inventrec.Total_Qty,0.0);
								inventrec.Total_Qty=0;
								inventrec.Available_Qty=0;
							}
						}
						if(balqty == 0)
						{
							info "before break";
							break;
						}
						i = i + 1;
					}
				}
				//--
				//Subracting stock-batch
				// Basic
				/*bat = Stock_Batch[Part_No == rec.Part_No && Part_Description == rec.Part_Description && Status != "Issued" && Batch_No == rec.Batch_No.Batch_No];
			if(bat.Available_Quantity == rec.Issued_Quantity)
			{
				bat.Status="Issued";
			}
			if(bat.Available_Quantity > rec.Issued_Quantity)
			{
				bat.Status="Partially Issued";
				bat.Available_Quantity=bat.Available_Quantity - rec.Issued_Quantity;
			}*/
				// Advanced
				iss_qty = 0;
				ava_qty = 0;
				bal_qty = 0;
				//	if(rec.Specification == null || rec.Specification == "")
				//		{
				bat = Stock_Batch[Part_No == rec.Part_No && Part_Description == rec.Part_Description && Status != "Issued" && Location == rec.Location && Warehouse == input.Warehouse && Sub_Location == rec.Sub_Location && Racks_Bins == rec.Racks_Bins];
				//		}
				//		else
				//		{
				//			bat = Stock_Batch[Part_No == rec.Part_No && Part_Description == rec.Part_Description && Specification == rec.Specification && Status != "Issued" && Location == rec.Location && Warehouse == input.Warehouse && Sub_Location == rec.Sub_Location && Racks_Bins == rec.Racks_Bins];
				//		}
				bat_no_list = List();
				iss_qty = rec.Issued_Quantity;
				for each  i1 in bat
				{
					bat_no = Stock_Batch[ID == i1].Batch_No;
					bat_no_list.add(bat_no);
				}
				info bat_no_list;
				i = 0;
				for each  no in bat_no_list
				{
					batching = Stock_Batch[Batch_No == no];
					ava_qty = batching.Available_Quantity;
					i = i + 1;
					if(i == 1 && iss_qty > ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = iss_qty - ava_qty;
					}
					else if(i == 1 && iss_qty < ava_qty)
					{
						batching.Status="Partially Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=ava_qty - iss_qty;
						bal_qty = 0;
					}
					else if(i == 1 && iss_qty == ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = 0;
					}
					else if(i > 1 && bal_qty > ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = bal_qty - ava_qty;
					}
					else if(i > 1 && bal_qty < ava_qty)
					{
						batching.Status="Partially Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=ava_qty - bal_qty;
						bal_qty = 0;
					}
					else if(i > 1 && bal_qty == ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=bal_qty;
						batching.Available_Quantity=0;
						bal_qty = 0;
					}
				}
				// Updating Stock value
				temp_issued_qty = rec.Issued_Quantity;
				ival = 0;
				bal = 0;

			}
			if(rec.Balance_Quantity == null || rec.Balance_Quantity == 0)
			{
				fetch_mat_subform.Status="Issued";
			}
			else
			{
				fetch_mat_subform.Status="Partially Issued";
			}
		}
	}
	else if(input.Form_Mode == "Direct GIN" || input.Form_Mode == "")
	{
		str = thisapp.Common.Number_Function_New("Material Request");
		gin_without_mrq = insert into Material_Request
		[
			Request_Date=zoho.currentdate
			Added_User=zoho.loginuser
			Request_Raised_By=input.Issued_By
			Warehouse=input.Warehouse
			Material_Type=input.Material_Request_Type
			Material_Request_No=str
			MR_Status="MRQ from GIN"
		];
		input.Material_Request_RECID = gin_without_mrq;
		Statusw = "";
		Balance_Qtyw = input.Item_Details.Balance_Quantity;
		if(Balance_Qtyw < 1)
		{
			Statusw = "Issued";
		}
		else
		{
			Statusw = "Partially Issued";
		}
		for each  recmrsf in input.Item_Details
		{
			insert into Material_Request_Subform
			[
				Part_Description=recmrsf.Part_No
				Part_No=recmrsf.Part_Description
				Added_User=zoho.loginuser
				Material_Type=recmrsf.Material_Type
				Department=input.Issued_Empolyee_Department
				UoM=recmrsf.Unit_of_Measurement
				Specification=recmrsf.Specification
				Stock_Qty=recmrsf.Stock_Quantity
				Required_Qty=recmrsf.Required_Quantity
				Balance_Qty=recmrsf.Balance_Quantity
				Status=Statusw
				Quantity_issued_so_far=recmrsf.Issued_Quantity
				Material_Req_Exis_ID=gin_without_mrq
			]
		}
		//For GIN Validtaions
		for each  rec in input.Item_Details
		{
			if(rec.Issued_Quantity != null || rec.Issued_Quantity != 0)
			{
				rec.Material_Request_No=str;

				//below is new code to handle when items are in multiple times with different places.
				getinventory = Inventory[Part_No == rec.Part_No] sort by Total_Qty desc;
				info getinventory;
				if(getinventory.count() > 0)
				{

					balqty = 0;
					i = 1;
					for each  inventrec in getinventory
					{
						//Issued Quantiy is less total qty
						if(rec.Issued_Quantity <= inventrec.Total_Qty && i == 1)
						{
							inventrec.Total_Qty=ifnull(inventrec.Total_Qty,0.0) - ifnull(rec.Issued_Quantity,0.0);
							inventrec.Available_Qty=ifnull(inventrec.Available_Qty,0.0) - ifnull(rec.Issued_Quantity,0.0);
						}
						//Issued Quantity is more total qty
						else if(rec.Issued_Quantity > inventrec.Total_Qty && i == 1)
						{
							balqty = ifnull(rec.Issued_Quantity,0.0) - ifnull(inventrec.Total_Qty,0.0);
							inventrec.Total_Qty=0;
							inventrec.Available_Qty=0;
						}
						//for first time it should not get inside the loop 
						if(balqty > 0 && i > 1)
						{
							info "balaance qty is more than zero";
							//Balance Qty is less 
							if(balqty <= inventrec.Total_Qty)
							{
								info "balance qty is less than total qty";
								inventrec.Total_Qty=ifnull(inventrec.Total_Qty,0.0) - ifnull(balqty,0.0);
								inventrec.Available_Qty=ifnull(inventrec.Available_Qty,0.0) - ifnull(balqty,0.0);
								balqty = 0;
							}
							//Balance Qty is More
							else if(balqty >= inventrec.Total_Qty)
							{
								info "balance qty is greater than total qty";
								balqty = ifnull(balqty,0.0) - ifnull(inventrec.Total_Qty,0.0);
								inventrec.Total_Qty=0;
								inventrec.Available_Qty=0;
							}
						}
						if(balqty == 0)
						{
							info "before break";
							break;
						}
						i = i + 1;
					}

				iss_qty = 0;
				ava_qty = 0;
				bal_qty = 0;
				bat = Stock_Batch[Part_No == rec.Part_No && Part_Description == rec.Part_Description && Status != "Issued" && Warehouse == input.Warehouse && Location == rec.Location && Sub_Location == rec.Sub_Location && Racks_Bins == rec.Racks_Bins];
				bat_no_list = List();
				iss_qty = rec.Issued_Quantity;
				for each  i1 in bat
				{
					bat_no = Stock_Batch[ID == i1].Batch_No;
					bat_no_list.add(bat_no);
				}
				info bat_no_list;
				i = 0;
				for each  no in bat_no_list
				{
					batching = Stock_Batch[Batch_No == no];
					ava_qty = batching.Available_Quantity;
					i = i + 1;
					if(i == 1 && iss_qty > ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = iss_qty - ava_qty;
					}
					else if(i == 1 && iss_qty < ava_qty)
					{
						batching.Status="Partially Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=ava_qty - iss_qty;
						bal_qty = 0;
					}
					else if(i == 1 && iss_qty == ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = 0;
					}
					else if(i > 1 && bal_qty > ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=0;
						bal_qty = bal_qty - ava_qty;
					}
					else if(i > 1 && bal_qty < ava_qty)
					{
						batching.Status="Partially Issued";
						batching.Issued_Qty_So_far=iss_qty;
						batching.Available_Quantity=ava_qty - bal_qty;
						bal_qty = 0;
					}
					else if(i > 1 && bal_qty == ava_qty)
					{
						batching.Status="Issued";
						batching.Issued_Qty_So_far=bal_qty;
						batching.Available_Quantity=0;
						bal_qty = 0;
					}
				}
				// Updating Stock value
				temp_issued_qty = rec.Issued_Quantity;
				ival = 0;
				bal = 0;
				if(temp_issued_qty != 0)
				{

				}
			}
		}
	}
	//Insert / Update the Issued Details
	for each  Itemdetrec in input.Item_Details
	{
		insert into Inventory_Ageing
		[
			Added_User=zoho.loginuser
			Part_No=Itemdetrec.Part_No
			Part_Description=Itemdetrec.Part_Description
			Specification=Itemdetrec.Specification
			Issued_Stock=Itemdetrec.Issued_Quantity
			Stock_Added_Issued_Date=zoho.currentdate
		]
	}
	getdeptname = Department[ID == input.Issued_Empolyee_Department].Department_Name;
	//The code below is to get Project cost 
	posum = 0;
	fc = 0;
	for each  rec in input.Item_Details
	{
		fet_posub = Purchase_Order_Subform[Part_No == rec.Part_No];
		if(rec.Part_No == fet_posub.Part_No)
		{
			posum = posum + ifnull(fet_posub.Rate,0.00);
			finalcost = fet_posub.Rate * rec.Issued_Quantity;
		}
		else
		{
			fet_venSub = Vendor_Contract_Subform[Part_Description == rec.Part_Description].maximum(Unit_Price);
			posum = posum + ifnull(fet_venSub,0.00);
			finalcost = ifnull(fet_posub.Rate,0.0) * ifnull(rec.Issued_Quantity,0.0);
		}
		fc = fc + finalcost;
	}
	input.Project_Cost = fc;
	input.Project_Rate = posum;
	//below code is to update in zoho project form
	if(input.Project_Name.Project_Title != null)
	{
		Fet_ZohoProject = Zoho_Projects_Data[ID == input.Project_Name];
		if(Fet_ZohoProject.GIN_Item_Total_Amount == 0 || Fet_ZohoProject.GIN_Item_Total_Amount == null)
		{
			Fet_ZohoProject.GIN_Item_Total_Amount=ifnull(input.Project_Cost,0.00);
		}
		else
		{
			Fet_ZohoProject.GIN_Item_Total_Amount=ifnull(Fet_ZohoProject.GIN_Item_Total_Amount,0.00) + Ifnull(input.Project_Cost,0.00);
		}
	}
	//THE Below function write the record in stock ledger.
	thisapp.Stock_Ledger.Quantity_out_for_Stock_Ledger(input.ID);

	for each  itemrec in input.Item_Details
	{
		//if(itemrec.Part_No.Part_No == "100166" || itemrec.Part_No.Part_No == "100044")
		if(itemrec.Part_No.Part_No == "100166")
		{
			//thisapp.Books.Adjust_Item_Inventory_in_zbooks(itemrec.ID);
			//thisapp.Inventory.update_books_stock_details(itemrec.ID);
		}
	}
	if(var == 1)
	{
		openUrl("#Form:Alert_Messages?Status=" + "GIN" + "&Value=" + input.GIN_Number + "&zc_LoadIn=dialog","same window");
	}
	else
	{
		openUrl("#Form:GIN","same window");
	}
}
catch (e)
{
	sendmail
	[
		from :"erp@carrierwheels.com"
		to :"parthasarathy.m@synprosoft.com"
		subject :"GIN Created Or Edited Successful Form Submission try & catch" + input.ID
		message :e
	]
}
content_copyCOPY