Time & Materials Invoice (not Project)

Hi,
We have a scenario when sometimes we are entering a Sales Order for ‘hours’ to be sold. It might be to investigate something for a client. While we have the Projects module, it is not big enough to warrant setting up a Project. We need to capture the costs (generally internal labour) on a job.
If I setup the Sales Order line to be Engineering with a qty of 10 and an hourly rate of say $100, if I select Make Direct, it creates an MFG job to make 10 x Engineering. If I go and put estimates in on the operation for 10 hours, it multiples out to 100. I know I can use Fixed Qty. Is there a better way to track Time & Materials for Invoicing without creating a Project?
Thanks.

@traceyash
Do you have Filed Service module ?
If yes, then it will be better to

  • Create Service call
  • Create Service cal line
  • Create Service job against call
  • Add operation and materials required to service job
  • Issue material to service job
  • Report time to service job
  • Invoice service call.

Use Fixed Qty as 10 and it should work. One of my client extensively use Sales Order cycle for this.

Hi,
We do have field service but haven’t yet implemented it as yet!!! Any tips or tricks you wish to share?

We can use fixed qty but the challenge is then to work out how many hours to charge for. If say you work 87 hours and you change the sales order, you sometimes can’t as it is linked to a job. The original hours on the sales order is just an estimate.

If you want to bill based on actual hours , then follow this: SO qty - 10, Job qty -10, Est. hours - 1 which will be 10 hours. Let us say actual is 50 hours, then change SO qty and Job qty to 50 and ship and invoice. You should be able to change SO and Job qty at anytime. If you are good good customisation, then you can create a button in SO Entry which can pick up actual hours and change the Job and SO Qty.

Ah good idea thanks.

I have done something similar. Below code might be useful. Its done in SO Entry.

JobEntryAdapter adapterJobEntry = new JobEntryAdapter(this.oTrans);
adapterJobEntry.BOConnect();
adapterJobEntry.GetByID(adapterSOEntry.SalesOrderData.OrderDtl[j][“JobNum_c”].ToString());

              for (int l = 0; l < adapterJobEntry.JobEntryData.JobOper.Rows.Count; l++)
              {
                 if ((bool)(adapterJobEntry.JobEntryData.JobOper[l]["Billable_c"]) == true )
                 {
                      
                      lTotLabourHours = lTotLabourHours + Convert.ToDecimal(adapterJobEntry.JobEntryData.JobOper[l]["BillableHours_c"]) ;
                  }
              }

	  adapterSOEntry.SalesOrderData.OrderDtl[j]["RowMod"] = "U" ;
                 if (lTotLabourHours == 0)  lTotLabourHours = 1; 
              adapterSOEntry.ChangeSellingQtyMaster(lTotLabourHours, false, false, true, true, false, true, lPartNum,
              "", "", "", lSalesUM, lSellingFactor, out vcResponseMsg, out vcDisplayMsg , out vcCompliantMsg , out vcResponseMsgOrdRel);
                               
              adapterSOEntry.MasterUpdate(false, false, "OrderDtl", lCustNum, lOrderNum, false, out vlContinue, 
              out  vcResponseMsg,out vlCreditShipAction, out vcDisplayMsg, out vcCompliantMsg , out vcResponseMsgOrdRel  );

Thank you!!!