Page 1 of 1

Profit Margin and % on Sales Order Lines

PostPosted: Mon Apr 08, 2024 9:55 am
by Ernst
On a Sales Order, customer wanted the Margin and Margin%, though this would a standard column, but alas, no.
Has anybody created plugin with Margin and Margin %.

Which cost would we use Cost on line(LCost) or average Cost on Line Details? Average sound more accurate, if available.

Re: Profit Margin and % on Sales Order Lines  Topic is solved

PostPosted: Mon Apr 08, 2024 10:50 am
by DannyC
I've done a plugin which works out the gross profit %.
It's quite easy. Just created a custom field on the line. This is the crux of the code:

Code: Select all
   private void SalesOrderLineChanged(object sender, JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrderLine line, System.ComponentModel.PropertyChangedEventArgs e)
   {
      if (!line.CommentLine && line.CostIn != 0)
      {
         decimal GP = (line.DiscountedPrice - line.CostIn)/line.DiscountedPrice * 100;
         line.CustomFieldValues.get_ItemFromSettingName("SOGP%").Contents = GP.ToString();
      }      
   }


and (for the whole order)

Code: Select all
   private void ShowOrderGP(object sender, System.EventArgs e)
   {
      JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder salesorder = (JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder)sender;
      decimal GP = 0;
      decimal totalcost = 0;
      
      foreach(JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrderLine line in salesorder.SalesOrderLines)
      {
         totalcost += line.LastCost*line.QuantityThisDelivery;
      }
      
      GP = (salesorder.SalesOrderLines.ExGSTTotal-totalcost)/salesorder.SalesOrderLines.ExGSTTotal * 100;
}


After the GP has been calculated, you can chuck it in a custom field, or maybe on the Reference, or where ever you want.

Re: Profit Margin and % on Sales Order Lines

PostPosted: Mon Apr 08, 2024 11:07 am
by Ernst
Thanks Danny, Will give that a go..

Re: Profit Margin and % on Sales Order Lines

PostPosted: Mon Apr 08, 2024 4:30 pm
by Mike.Sheen
instead of:

Code: Select all
line.CustomFieldValues.get_ItemFromSettingName("SOGP%").Contents = GP.ToString();


You can do:

Code: Select all
line.CustomFieldValues.SetValue<decimal>)("SOGP%", GP);


We also have a helper method to get the value:

Code: Select all
decimal GP = line.CustomFieldValues.GetValue<decimal>)("SOGP%", 0);


Make the code a bit cleaner and uses strong typing, which is always a good thing.

Re: Profit Margin and % on Sales Order Lines

PostPosted: Mon Apr 08, 2024 6:55 pm
by Ernst
OK Ive done this. Tried to lock column so it wasn't really changeable. Both custom fields are Text.
Kinda works. But if no stock, then no calc. Will see if customers wants me to use Lcost in that case... Any comments?

Code: Select all
   Public Sub SalesOrder_ReadEnd(sender As Object, e As System.EventArgs)
         Dim salesOrderObject As JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder = DirectCast(sender, JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder)
         If Not salesOrderObject.Client Is Nothing AndAlso TypeOf(salesOrderObject.Client) Is JiwaFinancials.Jiwa.JiwaSalesUI.SalesOrder.BaseSalesOrderEntryForm Then
            Dim salesOrderForm As JiwaFinancials.Jiwa.JiwaSalesUI.SalesOrder.BaseSalesOrderEntryForm = DirectCast(salesOrderObject.Client, JiwaFinancials.Jiwa.JiwaSalesUI.SalesOrder.BaseSalesOrderEntryForm)
            salesOrderForm.grdLines.LockColumn(True, "PLuginName.GP", -1)
               salesOrderForm.grdLines.LockColumn(True, "PLuginName.GPPerc", -1)


   Private Sub SalesOrderLines_Changed(ByVal Item As JiwaSales.SalesOrder.SalesOrderLine, e As System.ComponentModel.PropertyChangedEventArgs)
   Dim salesOrder As JiwaSales.SalesOrder.SalesOrder = DirectCast(item.SalesOrderLines.SalesOrder, JiwaSales.SalesOrder.SalesOrder)
   Dim salesOrderObject As JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder = DirectCast(salesOrder, JiwaFinancials.Jiwa.JiwaSales.SalesOrder.SalesOrder)
   Dim salesOrderForm As JiwaFinancials.Jiwa.JiwaSalesUI.SalesOrder.BaseSalesOrderEntryForm = DirectCast(salesOrderObject.Client, JiwaFinancials.Jiwa.JiwaSalesUI.SalesOrder.BaseSalesOrderEntryForm)   
   Dim SalesOrderH As JiwaSales.SalesOrder.SalesOrderHistory = Item.SalesOrderLines.SalesOrder.SalesOrderHistorys(Item.SalesOrderLines.SalesOrder.CurrentHistoryNo)

   If Not item.CommentLine AndAlso item.CostIn <> 0 Then
           Dim GPP As Decimal = (item.DiscountedPrice - item.CostIn) / item.DiscountedPrice * 100
      Dim GPD As Decimal = (item.DiscountedPrice - item.CostIn)
      item.CustomFieldValues.SetValue(Of String)("GPPerc",System.Math.Round(GPP,2) & "%")
      item.CustomFieldValues.SetValue(Of Decimal)("GP",System.Math.Round(GPD,2))
      salesOrderForm.grdLines.LockColumn(True, "PLuginName.GP", -1)
      salesOrderForm.grdLines.LockColumn(True, "PLuginName.GPPerc", -1)
    End If

Capture.PNG
Capture.PNG (35.54 KiB) Viewed 1680 times