Subject: Re: Help cleaning up this 1.0 gem
From: Steve <subsume@xxxxxxxxx>
Date: Fri, 5 Oct 2007 15:41:02 -0400
|
Forgot the output.
Service |All |A |B |C |Other
Service 1 |30.25 |6.5 |1.5 |2.75 |19.5
Service 2 |150.75 |32.25 |7.25 |14.5 |96.75
Service 3 |2.25 |0.25 |0 |0 |2
Service 4 |50.25 |11 |2.5 |5 |31.75
Service 5 |25 |0 |0 |0 |25
...
Total |851.75 |155.25 |35 |69 |554.5
On 10/5/07, Steve <subsume@xxxxxxxxx> wrote:
> In general, my company provides services and we get credit up to a
> certain quota from the funding sources (A, B, C, OTHER).
>
> I'm simply looking for suggestions to simplify this template in order
> to a) increase maintainability b) solve some minor externalities.
>
> Because we report to the nearest quarter hour, I had to pass the
> difference because, after several recursive rounds of the below
> template, the small bit rounded off adds up to significant
> discrepencies with the original, unrounded, total. However, I'm still
> finding that the total ($XshouldBe) is different than the recursive
> total generated (by a quarter-hour).
>
> Template can also be passed a Record/Activity but that can be ignored here.
>
> $services variable goes like:
> <records>
> <Record>
> <service>Service n</service>
> <hours>123</hours>
> </Record>
> </records>
>
> <xsl:template select="/">
> <xsl:apply-templates select="$services[1]">
> <xsl:with-param name="AshouldBe" select="$Atotal" />
> <xsl:with-param name="BshouldBe" select="$Btotal" />
> <xsl:with-param name="CshouldBe" select="$Ctotal" />
>
> <!-- below WF = "Without (funding source) Five". Since
> its hours don't count -->
>
> <xsl:with-param name="Aratio" select="$SSAtotal div $totalWF" />
> <xsl:with-param name="Bratio" select="$partBtotal div $totalWF" />
> <xsl:with-param name="Cratio" select="$Ctotal div $totalWF" />
> <xsl:with-param name="OTHERratio" select="($totalWF - ( $Atotal +
> $Btotal + $Ctotal ) ) div $totalWF" />
> </xsl:apply-templates>
> </xsl:template>
> <xsl:template match="Record">
> <xsl:param name="AshouldBe" />
> <xsl:param name="BshouldBe" />
> <xsl:param name="CshouldBe" />
>
> <!-- below 't' suffix = 'total' -->
>
> <xsl:param name="Allt">0</xsl:param>
> <xsl:param name="At">0</xsl:param>
> <xsl:param name="Ct">0</xsl:param>
> <xsl:param name="Bt">0</xsl:param>
> <xsl:param name="OTHERt">0</xsl:param>
>
> <!-- ratio - percent of hours allocated to each funding source -->
>
> <xsl:param name="Aratio" />
> <xsl:param name="Bratio" />
> <xsl:param name="Cratio" />
> <xsl:param name="OTHERratio" />
>
> <!-- differences -->
>
> <xsl:param name="Adiff">0</xsl:param>
> <xsl:param name="Bdiff">0</xsl:param>
> <xsl:param name="Cdiff">0</xsl:param>
>
> <!-- needed because when service = 5, no allocation comes from
> A,B, or C. -->
> <xsl:variable name="i_A">
> <xsl:choose>
> <xsl:when test="not(service) or service != 'Service
> 5"><xsl:value-of select="$Aratio" /></xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="i_B">
> <xsl:choose>
> <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$Bratio" /></xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="i_C">
> <xsl:choose>
> <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$Cratio" /></xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="i_OTHER">
> <xsl:choose>
> <xsl:when test="not(service) or service != 'Service
> 5'"><xsl:value-of select="$OTHERratio" /></xsl:when>
> <xsl:otherwise>1</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="All" select="round(hours * 4) div 4" />
>
> <!-- 'wo' = without. As in, without any correction for the
> differences -->
>
> <xsl:variable name="Awo">
> <xsl:value-of select="$i_A * hours" />
> </xsl:variable>
> <xsl:variable name="Bwo">
> <xsl:value-of select="$i_B * hours" />
> </xsl:variable>
> <xsl:variable name="Cwo">
> <xsl:value-of select="$i_C * hours" />
> </xsl:variable>
>
> <!-- funding sources with the differential factored -->
>
> <xsl:variable name="A">
> <xsl:choose>
> <xsl:when test="$i_A != 0 and round( ( $Awo + $Adiff ) * 4) div 4 > 0">
> <xsl:value-of select="round( ( $Awo + $Adiff ) * 4) div 4" />
> </xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="B">
> <xsl:choose>
> <xsl:when test="$i_B != 0 and round( ( $Bwo + $Bdiff ) * 4) div 4 > 0">
> <xsl:value-of select="round( ( $Bwo + $Bdiff ) * 4) div 4" />
> </xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="C">
> <xsl:variable name="test" select="round( ( $Cwo + $Cdiff ) * 4) div 4" />
> <xsl:choose>
> <xsl:when test="$i_C != 0 and $test > 0 and $test <= $All">
> <xsl:value-of select="$test" />
> </xsl:when>
> <xsl:when test="$test > $All">
> <xsl:value-of select="$All" />
> </xsl:when>
> <xsl:otherwise>0</xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <xsl:variable name="OTHER">
> <xsl:choose>
> <xsl:when test="round($OTHERratio * hours * 4) div 4 > 0" >
> <xsl:value-of select="round($OTHERratio * hours * 4) div 4" />
> </xsl:when>
> <xsl:otherwise>
> 0
> </xsl:otherwise>
> </xsl:choose>
> </xsl:variable>
> <tr>
> <td class="left">
> <xsl:choose>
> <xsl:when test="service">
> <xsl:value-of select="service" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="activity" />
> </xsl:otherwise>
> </xsl:choose>
> </td>
> <td><xsl:value-of select="$All" /></td>
> <td><xsl:value-of select="$A" /></td>
> <td><xsl:value-of select="$B" /></td>
> <td><xsl:value-of select="$C" /></td>
> <td><xsl:value-of select="$OTHER + ($All - $A - $B - $OTHER - $C)" /></td>
> </tr>
> <xsl:choose>
> <xsl:when test="following-sibling::Record[1]">
> <xsl:apply-templates select="following-sibling::Record[1]">
> <xsl:with-param name="AshouldBe" select="$AshouldBe" />
> <xsl:with-param name="BshouldBe" select="$BshouldBe" />
> <xsl:with-param name="CshouldBe" select="$CshouldBe" />
> <xsl:with-param name="Aratio" select="$Aratio" />
> <xsl:with-param name="Bratio" select="$Bratio" />
> <xsl:with-param name="Cratio" select="$Cratio" />
> <xsl:with-param name="OTHERratio" select="$OTHERratio" />
> <xsl:with-param name="Adiff">
> <xsl:choose>
> <xsl:when test="$i_A = 0">
> <xsl:value-of select="$Adiff" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:choose>
> <xsl:when test="$A = round( $Awo * 4 ) div 4">
> <xsl:value-of select="($Adiff + $Awo) - $A" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="$Awo - $A" />
> </xsl:otherwise>
> </xsl:choose>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:with-param>
> <xsl:with-param name="Cdiff">
> <xsl:choose>
> <xsl:when test="$i_C = 0">
> <xsl:value-of select="$Cdiff" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:choose>
> <xsl:when test="$C = round( $Cwo * 4 ) div 4">
> <xsl:value-of select="($Cdiff + $Cwo) - $C" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="$Cwo - $C" />
> </xsl:otherwise>
> </xsl:choose>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:with-param>
> <xsl:with-param name="Bdiff">
> <xsl:choose>
> <xsl:when test="$i_B = 0">
> <xsl:value-of select="$Bdiff" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:choose>
> <xsl:when test="$B = round( $Bwo * 4 ) div 4">
> <xsl:value-of select="($Bdiff + $Bwo) - $B" />
> </xsl:when>
> <xsl:otherwise>
> <xsl:value-of select="$Bwo - $B" />
> </xsl:otherwise>
> </xsl:choose>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:with-param>
> <xsl:with-param name="Allt" select="$Allt + $All"/>
> <xsl:with-param name="At" select="$At + $A"/>
> <xsl:with-param name="Bt" select="$Bt + $B"/>
> <xsl:with-param name="Ct" select="$Ct + $C"/>
> <xsl:with-param name="OTHERt" select="$OTHERt + $OTHER"/>
> </xsl:apply-templates>
> </xsl:when>
> <xsl:otherwise>
> <tr>
> <td style="text-align:right">Total</td>
> <td><xsl:value-of select="$Allt + $All" /></td>
> <td>
> <xsl:value-of select="$At + $A" />
> <xsl:if test="$At + $A != $AshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$At + $A -
> $AshouldBe"/>)</font></xsl:if>
> </td>
> <td>
> <xsl:value-of select="$Bt + $B" />
> <xsl:if test="$Bt + $B != $BshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$Bt + $B -
> $BshouldBe"/>)</font></xsl:if>
> </td>
> <td>
> <xsl:value-of select="$Ct + $C" />
> <xsl:if test="$Ct + $C != $CshouldBe"><font color="red"
> class="screen">(<xsl:value-of select="$Ct + $C -
> $CshouldBe"/>)</font></xsl:if>
> </td>
> <td><xsl:value-of select="$OTHERt + ($All - $A - $B - $OTHER - $C)
> + ($Allt - $At - $Bt - $OTHERt - $Ct)" /></td>
> </tr>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:template>
|