function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Admin ProcessAdmin Process 

How to get fiscal year and Period year from date

Hi,

It is my first post in this Community, I have not experience in Apex Code, I am learning it.

We need to update two custom fields based on the fiscal calendar set in my organization.

We have the custom field INVOICEDATE _ C which contains the date on which the invoice was made, based on this date we have to look for the year and fiscal period that corresponds for each invoice.

The following code was made in the window execute Anonymous but sent the following error message.

Line: 20, Column: 1
Invalid loop variable type expected SObject was SAF263SPPISalesPaymentPromotionInvoice__c

CODE APEX

Map<Date, String> mapYear;
Map<Date, Integer> mapPeriod;
mapYear = new Map<Date, String>();
mapPeriod = new Map<Date, Integer>();

//List<SAF263SPPISalesPaymentPromotionInvoice__c> dINVOICEDATE = [SELECT ID, INVOICEDATE__c FROM SAF263SPPISalesPaymentPromotionInvoice__c WHERE FiscalYear__c = NULL AND     FiscalPeriod__c = NULL];
    
for(Period GetYearPeriod : [SELECT FiscalYearSettings.Name, Number, StartDate, EndDate 
            FROM Period where FiscalYearSettings.YearType = 'Custom' And Type = 'Month'])
{
    mapYear.put(GetYearPeriod.StartDate, GetYearPeriod.FiscalYearSettings.Name);
    mapPeriod.put(GetYearPeriod.StartDate, GetYearPeriod.Number);
}
System.debug('En SAF263 mapYear: ' + mapYear.KeySet());
System.debug('En SAF263 mapYear: ' + mapYear.Values());
System.debug('En SAF263 mapPeriod: ' + mapPeriod.KeySet());
System.debug('En SAF263 mapPeriod: ' + mapPeriod.Values());


for (SAF263SPPISalesPaymentPromotionInvoice__c objYearPeriod : Trigger.new)
{
    
    if(mapYear.containsKey(objYearPeriod.INVOICEDATE__c))
    {
        objYearPeriod.FiscalYear__c = mapYear.get(objYearPeriod.INVOICEDATE__c);
    }
    System.debug('EN CuotaUsuario_tgr objYearPeriod.FiscalYear__c: ' + objYearPeriod.FiscalYear__c);
    
    if(mapPeriod.containsKey(objYearPeriod.INVOICEDATE__c))
    {
        objYearPeriod.FiscalPeriod__c = mapPeriod.get(objYearPeriod.INVOICEDATE__c);
    }
    System.debug('EN CuotaUsuario_tgr objYearPeriod.FPeriod__c: ' + objYearPeriod.FPeriod__c);
}    

Could you help me? to know what I have wrong or if there is any other way to perform the update of the two custom fields.

I'll thank you very much for your support.
 
Best Answer chosen by Admin Process
Admin ProcessAdmin Process
Hi Deepali,

thanks in advance, but in our fiscal year the periods are combined with the last week of the previous month, for example:

FY19 Period 10 from Febraury 25th to March 24th.

I have managed to get the right code, the annex for future reference or if someone is useful.

List<SAF263SPPISalesPaymentPromotionInvoice__c> dINVOICEDATE = [SELECT ID, INVOICEDATE__c FROM SAF263SPPISalesPaymentPromotionInvoice__c WHERE FiscalYear__c = NULL AND    FiscalPeriod__c = NULL AND INVOICEDATE__c = THIS_FISCAL_QUARTER];
    
List<Period> GetYearPeriod = [SELECT FiscalYearSettings.Name, Number, StartDate, EndDate 
            FROM Period where FiscalYearSettings.YearType = 'Custom' And Type = 'Month' And StartDate >= LAST_FISCAL_YEAR];

for (SAF263SPPISalesPaymentPromotionInvoice__c objYearPeriod : dINVOICEDATE)
{
    for(Period pp: GetYearPeriod){
        if((objYearPeriod.INVOICEDATE__c >= pp.StartDate) && ( objYearPeriod.INVOICEDATE__c <= pp.EndDate ))
            {
                objYearPeriod.FiscalYear__c = pp.FiscalYearSettings.Name;
                objYearPeriod.FiscalPeriod__c = pp.Number;
            }
           
        
    }
    
    

update dINVOICEDATE;

All Answers

Deepali KulshresthaDeepali Kulshrestha
Hi Admin

&" - FY"
&CASE(
  MONTH( StartDate ),
  1, (Year( StartDate )),
  2, (Year( StartDate )),
  3, (Year( StartDate )),
  4, (Year( StartDate )),
  5, (Year( StartDate )),
  6, (Year( StartDate )),
  7, (Year( StartDate )),
  (Year( StartDate ))+1)
&" - "
&CASE(
  MONTH( StartDate ),
  1, "January",
  2, "February",
  3, "March",
  4, "April",
  5, "May",
  6, "June",
  7, "July",
  8, "August",
  9, "September",
  10, "October",
  11, "November",
  "December")
&" - "
&Team_Leader__c


Solution:

&TEXT(CASE(
  MONTH( StartDate ),
  1, (Year( StartDate )),
  2, (Year( StartDate )),
  3, (Year( StartDate )),
  4, (Year( StartDate )),
  5, (Year( StartDate )),
  6, (Year( StartDate )),
  7, (Year( StartDate )),
  (Year( StartDate ))+1)
)
&" - "


I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.
Thanks.    
Deepali Kulshrestha
Admin ProcessAdmin Process
Hi Deepali,

thanks in advance, but in our fiscal year the periods are combined with the last week of the previous month, for example:

FY19 Period 10 from Febraury 25th to March 24th.

I have managed to get the right code, the annex for future reference or if someone is useful.

List<SAF263SPPISalesPaymentPromotionInvoice__c> dINVOICEDATE = [SELECT ID, INVOICEDATE__c FROM SAF263SPPISalesPaymentPromotionInvoice__c WHERE FiscalYear__c = NULL AND    FiscalPeriod__c = NULL AND INVOICEDATE__c = THIS_FISCAL_QUARTER];
    
List<Period> GetYearPeriod = [SELECT FiscalYearSettings.Name, Number, StartDate, EndDate 
            FROM Period where FiscalYearSettings.YearType = 'Custom' And Type = 'Month' And StartDate >= LAST_FISCAL_YEAR];

for (SAF263SPPISalesPaymentPromotionInvoice__c objYearPeriod : dINVOICEDATE)
{
    for(Period pp: GetYearPeriod){
        if((objYearPeriod.INVOICEDATE__c >= pp.StartDate) && ( objYearPeriod.INVOICEDATE__c <= pp.EndDate ))
            {
                objYearPeriod.FiscalYear__c = pp.FiscalYearSettings.Name;
                objYearPeriod.FiscalPeriod__c = pp.Number;
            }
           
        
    }
    
    

update dINVOICEDATE;
This was selected as the best answer