public NW_GeneralResponse CreatePartialInvoice(PurchId PurchId, ProductReceiptId PackingSlipId, Num InvoiceNum, TransDate InvoiceDate)
 {
     VendPackingSlipJour vendPackingSlipJour;
     PurchFormLetter purchFormLetter;
     PurchTable  purchTable;
     PurchLine purchLine;
     VendPackingSlipTrans vendPackingSlipTrans;

     VendInvoiceInfoTable vendInvoiceInfoTable, vendInvoiceInfoTable2, vendInvoiceInfoTable3;
     VendInvoiceInfoLine vendInvoiceInfoLine;
     VendInvoiceInfoSubTable vendInvoiceInfoSubTable;
     VendInvoiceInfoSubLine vendInvoiceInfoSubLine;

     InvoiceId invoiceId;
     TransDate _invoiceDate;

     VendInvoiceJour vendInvoiceJour;
     InventTrans inventTransQty;
     str Log;
     boolean Result;
     List Errors;
     NW_GeneralResponse Response = new NW_GeneralResponse();

     ;
     changecompany('shc')
     {
        
         select vendPackingSlipJour 
             where vendPackingSlipJour.PurchId == PurchId
             && vendPackingSlipJour.PackingSlipId == PackingSlipId;

         while select vendInvoiceInfoTable2
             where vendInvoiceInfoTable2.InvoiceAccount == vendPackingSlipJour.InvoiceAccount
             && vendInvoiceInfoTable2.PurchId == PurchId
         {
             if(vendInvoiceInfoTable2.packingSlipId(vendInvoiceInfoTable2) == PackingSlipId)
             {
                 Result = false;
                 Response.ParmResult(Result);
                 Response.ParmMsg("You have already Invoice with this Product Receipt.");
                 Response.ParmErrors(Errors);
                 return Response;
             }
         }


         ttsBegin;
         if(vendPackingSlipJour.PackingSlipId)
         {
             invoiceId = InvoiceNum; //strFmt("INV-%1", vendPackingSlipJour.PackingSlipId);

             _invoiceDate = InvoiceDate;//DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());

             purchTable = vendPackingSlipJour.purchTable();
             //Generate Pending Invoice Header
             vendInvoiceInfoTable.clear();
             vendInvoiceInfoTable.initValue();
             vendInvoiceInfoTable.initFromPurchTable(purchTable);

             vendInvoiceInfoTable.ParmId = FormletterParmData::getNewParmId();

             vendInvoiceInfoTable.DocumentOrigin = DocumentOrigin::Manual;
             vendInvoiceInfoTable.CurrencyCode = purchTable.CurrencyCode;
             vendInvoiceInfoTable.DeliveryName = purchTable.DeliveryName;
             vendInvoiceInfoTable.Num = invoiceId;
             vendInvoiceInfoTable.PurchName = purchTable.PurchName;
             vendInvoiceInfoTable.VendInvoiceSaveStatus = VendInvoiceSaveStatus::Pending;
             vendInvoiceInfoTable.TransDate = _invoiceDate;
             vendInvoiceInfoTable.DocumentDate = _invoiceDate;
             vendInvoiceInfoTable.LastMatchVariance = LastMatchVarianceOptions::OK;
             vendInvoiceInfoTable.ParmJobStatus = ParmJobStatus::Waiting;

             vendInvoiceInfoTable.DefaultDimension = vendInvoiceInfoTable.copyDimension(purchTable.DefaultDimension);
             vendInvoiceInfoTable.defaultRow(purchTable);
             vendInvoiceInfoTable.insert();

             //Generate Vend Invoice Info reference
             if(vendInvoiceInfoTable)
             {
                 vendInvoiceInfoSubTable.clear();
                 vendInvoiceInfoSubTable.initValue();
                 vendInvoiceInfoSubTable.defaultRow();

                 vendInvoiceInfoSubTable.ParmId = vendInvoiceInfoTable.ParmId;
                 vendInvoiceInfoSubTable.OrigPurchId = vendInvoiceInfoTable.PurchId;
                 vendInvoiceInfoSubTable.PurchName = vendInvoiceInfoTable.PurchName;
                 vendInvoiceInfoSubTable.TableRefId = vendInvoiceInfoTable.TableRefId;

                 vendInvoiceInfoSubTable.insert();
             }

             //select all packing slip line
             while select vendPackingSlipTrans
                 where vendPackingSlipTrans.PackingSlipId == vendPackingSlipJour.PackingSlipId
                 && vendPackingSlipTrans.VendPackingSlipJour == vendPackingSlipJour.RecId
             {
                 //Generate Pending Invoice Line
                 purchLine = vendPackingSlipTrans.purchLine();
                 vendInvoiceInfoLine.clear();
                 vendInvoiceInfoLine.initValue();
                 // vendInvoiceInfoLine.defaultRow(null,purchLine);
                 vendInvoiceInfoLine.initFromPurchLine(purchLine);

                 vendInvoiceInfoLine.DeliveryName = vendInvoiceInfoTable.DeliveryName;
                 vendInvoiceInfoLine.ParmId = vendInvoiceInfoTable.ParmId;
                 vendInvoiceInfoLine.TableRefId = vendInvoiceInfoTable.TableRefId;
                 vendInvoiceInfoLine.currencyCode = vendInvoiceInfoTable.CurrencyCode;
                 vendInvoiceInfoLine.LineNum = any2int(purchLine.LineNumber);

                 vendInvoiceInfoLine.InvoiceAccount = vendInvoiceInfoTable.InvoiceAccount;
                 vendInvoiceInfoLine.InventDimId = vendPackingSlipTrans.InventDimId;
                 vendInvoiceInfoLine.OrderAccount = vendInvoiceInfoTable.OrderAccount;
                 vendInvoiceInfoLine.ItemId = vendPackingSlipTrans.ItemId;
                 vendInvoiceInfoLine.InventTransId = vendPackingSlipTrans.InventTransId;

                 vendInvoiceInfoLine.DocumentOrigin = DocumentOrigin::Manual;
                 vendInvoiceInfoLine.ReceiveNow = vendPackingSlipTrans.Qty;

                 vendInvoiceInfoLine.modifiedReceiveNow();

                 vendInvoiceInfoLine.PurchPrice = purchLine.PurchPrice;
                 vendInvoiceInfoLine.InventNow = vendInvoiceInfoLine.ReceiveNow;
                 if(purchLine.PurchQty != 0)
                 {
                     vendInvoiceInfoLine.LineAmount = (purchLine.LineAmount / purchLine.PurchQty) * vendInvoiceInfoLine.ReceiveNow;
                 }

                 vendInvoiceInfoLine.DefaultDimension = purchLine.DefaultDimension;

                 vendInvoiceInfoLine.insert();

                 //Generate Vend Invoice Info reference from packing slip
                 if(vendInvoiceInfoLine.RecId)
                 {
                     vendInvoiceInfoSubLine.clear();
                     vendInvoiceInfoSubLine.initValue();
                     vendInvoiceInfoSubLine.defaultRow();
                     vendInvoiceInfoSubLine.ParmId = vendInvoiceInfoTable.ParmId;
                     vendInvoiceInfoSubLine.LineRefRecId = vendInvoiceInfoLine.RecId;
                     vendInvoiceInfoSubLine.ReceiveNow = vendInvoiceInfoLine.ReceiveNow;
                     vendInvoiceInfoSubLine.InventNow = vendInvoiceInfoLine.InventNow ;
                     vendInvoiceInfoSubLine.JournalRefRecId = vendPackingSlipTrans.RecId;
                     vendInvoiceInfoSubLine.JournalRefTableId = vendPackingSlipTrans.TableId;
                     vendInvoiceInfoSubLine.DocumentId = vendPackingSlipTrans.PackingSlipId;
                     vendInvoiceInfoSubLine.insert();
                 }
             }
             ttsCommit;
             Response.ParmResult(true);
             Response.ParmMsg(strFmt("Invoice %1 has been Created for Purchase order %2 with Product Receipt %3",invoiceId, purchTable.PurchId, PackingSlipId));
             //Posting pending invoice invoice
             //purchFormLetter = PurchFormLetter_Invoice::newFromSavedInvoice(vendInvoiceInfoTable);
             //purchFormLetter.update(vendInvoiceInfoTable.purchTable(),vendInvoiceInfoTable.Num);
         }
         else
         {
             Response.ParmResult(false);
             Response.ParmMsg(strFmt("Can't found Product Receipt %1", PackingSlipId));
         }

         
         return Response;
     }
 }