<?php
	/**
	* phpGroupWare - property: a Facilities Management System.
	*
	* @author Sigurd Nes <sigurdne@online.no>
	* @copyright Copyright (C) 2003,2004,2005,2006,2007 Free Software Foundation, Inc. http://www.fsf.org/
	* This file is part of phpGroupWare.
	*
	* phpGroupWare is free software; you can redistribute it and/or modify
	* it under the terms of the GNU General Public License as published by
	* the Free Software Foundation; either version 2 of the License, or
	* (at your option) any later version.
	*
	* phpGroupWare is distributed in the hope that it will be useful,
	* but WITHOUT ANY WARRANTY; without even the implied warranty of
	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	* GNU General Public License for more details.
	*
	* You should have received a copy of the GNU General Public License
	* along with phpGroupWare; if not, write to the Free Software
	* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
	*
	* @license http://www.gnu.org/licenses/gpl.html GNU General Public License
	* @internal Development of this application was funded by http://www.bergen.kommune.no/bbb_/ekstern/
	* @package property
	* @subpackage export
 	* @version $Id: Agresso,v 1.34 2007/01/26 14:58:55 sigurdne Exp $
	*/

	/**
	 * Description
	 * @package property
	 */

	class export_conv
	{
		//var $fil_katalog='c:/temp'; //On windows use "//computername/share/filename" or "\\\\computername\share\filename" to check files on network shares.
		
		var $old_files_deleted;
		var $debug;
		
		function export_conv()
		{
			$GLOBALS['phpgw_info']['flags']['currentapp']	=	'property';
			$this->currentapp		= $GLOBALS['phpgw_info']['flags']['currentapp'];
	//		$this->db 			= $GLOBALS['phpgw']->db;

			$this->soXport = CreateObject('property.soXport');	
			$this->config = CreateObject('phpgwapi.config','property');
			$this->config->read_repository();
			$this->bocommon			= CreateObject($this->currentapp.'.bocommon');
			$this->db           	= $this->bocommon->new_db();			
		}

		function select_periods_with_invoice_to_transfer($pre_transfer='')
		{
			if($pre_transfer)
			{
				$sql= "SELECT DISTINCT periode from fm_ecobilag WHERE utbetalingsigndato IS NULL ";
			}
			else
			{
				$sql= "SELECT DISTINCT periode from fm_ecobilag WHERE budsjettsigndato is not null and (saksigndato is not null or oppsynsigndato is not null) and utbetalingsigndato is not null ";
			}
			
			$this->db->query($sql,__LINE__,__FILE__);
			while ($this->db->next_record())
			{
				$periode[]	= $this->db->f('periode');
			}
			return $periode;
		}

		function log_end($batchid)
		{
			$tid=date($this->soXport->datetimeformat);
	    		$sql= "insert into fm_ecologg (batchid,melding,tid) values ('$batchid','End transfer','$tid')";
			$this->db->query($sql,__LINE__,__FILE__);
	    	}

		function log_error($batchid,$error_desr)
		{
			$tid=date($this->datetimeformat);
	    		$sql= "insert into fm_ecologg (batchid,ecobilagid,status,melding,tid) values ('$batchid',NULL,0,'$error_desr','$tid')";
			$this->db->query($sql,__LINE__,__FILE__);
	    	}

		function increment_batchid()
		{

			$this->db->query("update fm_idgenerator  set value = value + 1 where name = 'Ecobatchid'",__LINE__,__FILE__);
			$this->db->query("select value from fm_idgenerator  where name = 'Ecobatchid'",__LINE__,__FILE__);
			$this->db->next_record();
			$bilagsnr = $this->db->f('value');
			return $bilagsnr;

		}

		function next_batchid()
		{

			$this->db->query("select value from fm_idgenerator  where name = 'Ecobatchid'",__LINE__,__FILE__);
			$this->db->next_record();
			$batchid = $this->db->f('value')+1;

			return $batchid;
		}

		//Lagre start melding
		function log_start($batchid)
		{
			$tid=date($this->soXport->datetimeformat);
	    		$sql= "insert into fm_ecologg (batchid,melding,tid) values ('$batchid','Start transfer','$tid')";
			$this->db->query($sql,__LINE__,__FILE__);
	    	}

		function get_vendor_info($vendor_id='')
		{
			$sql = "select org_nr,konto_nr from fm_vendor where id='$vendor_id'";
			$this->db->query($sql,__LINE__,__FILE__);
			$this->db->next_record();

			$vendor_info= array(
				'org_nr' => $this->db->f('org_nr'),
				'konto_nr' => $this->db->f('konto_nr')
				);

			return $vendor_info;
		}

		function get_order_title($order_id='')
		{
			$sql = "select type from fm_orders where id='$order_id'";
			$this->db->query($sql,__LINE__,__FILE__);
			$this->db->next_record();

			switch($this->db->f('type'))
			{
				case 'workorder':
					$sql2 = "select title from fm_workorder where id='$order_id'";
					$this->db->query($sql2,__LINE__,__FILE__);
					$this->db->next_record();
					$order_title = $this->db->f('title');
					break;
				case 's_agreement':
					$sql2 = "select descr as title from fm_s_agreement where id='$order_id'";
					$this->db->query($sql2,__LINE__,__FILE__);
					$this->db->next_record();
					$order_title = $this->db->f('title');
					break;
			}

			return $order_title;
		}


		function select_invoice_rollback($day,$month,$year,$Filnavn)
		{

			switch($GLOBALS['phpgw_info']['server']['db_type'])
			{
				case 'mssql':
					$datepart_year 		= "datepart(year,overftid)";
					$datepart_month 	= "datepart(month,overftid)";
					$datepart_day 		= "datepart(day,overftid)";
					break;
				case 'mysql':
					$datepart_year 		= "YEAR(overftid)";
					$datepart_month 	= "MONTH(overftid)";
					$datepart_day 		= "DAYOFMONTH(overftid)";
					break;
				case 'pgsql':
					$datepart_year 		= "date_part('year',overftid)";
					$datepart_month 	= "date_part('month',overftid)";
					$datepart_day 		= "date_part('day',overftid)";
					break;
				case 'postgres':
					$datepart_year 		= "date_part('year',overftid)";
					$datepart_month 	= "date_part('month',overftid)";
					$datepart_day 		= "date_part('day',overftid)";
					break;
			}


	    		$sql="select * from fm_ecobilagoverf where filnavn='$Filnavn' and $datepart_year=$year and $datepart_month=$month and $datepart_day= $day";
			$this->db->query($sql,__LINE__,__FILE__);

			$i = 0;
			while ($this->db->next_record())
			{
				$invoice_roleback[$i]['id']	= $this->db->f('id');
				$invoice_roleback[$i]['bilagsnr']	= $this->db->f('bilagsnr');
				$invoice_roleback[$i]['kidnr']	= $this->db->f('kidnr');
				$invoice_roleback[$i]['typeid']	= $this->db->f('typeid');
				$invoice_roleback[$i]['kildeid']	= $this->db->f('kildeid');
				$invoice_roleback[$i]['pmwrkord_code']	= $this->db->f('pmwrkord_code');
				$invoice_roleback[$i]['belop']	= $this->db->f('belop');
				$invoice_roleback[$i]['fakturadato']	= $this->db->f('fakturadato');
				$invoice_roleback[$i]['periode']	= $this->db->f('periode');
				$invoice_roleback[$i]['forfallsdato']	= $this->db->f('forfallsdato');
				$invoice_roleback[$i]['fakturanr']	= $this->db->f('fakturanr');
				$invoice_roleback[$i]['spbudact_code']	= $this->db->f('spbudact_code');
				$invoice_roleback[$i]['regtid']	= $this->db->f('regtid');
				$invoice_roleback[$i]['artid']	= $this->db->f('artid');
				$invoice_roleback[$i]['godkjentbelop']	= $this->db->f('godkjentbelop');
				$invoice_roleback[$i]['spvend_code']	= $this->db->f('spvend_code');
				$invoice_roleback[$i]['dima']	= $this->db->f('dima');
				$invoice_roleback[$i]['loc1']	= $this->db->f('loc1');
				$invoice_roleback[$i]['dimb']	= $this->db->f('dimb');
				$invoice_roleback[$i]['mvakode']	= $this->db->f('mvakode');
				$invoice_roleback[$i]['dimd']	= $this->db->f('dimd');
				$invoice_roleback[$i]['project_id']	= $this->db->f('project_id');
				$invoice_roleback[$i]['kostra_id']	= $this->db->f('kostra_id');
				$invoice_roleback[$i]['item_type']	= $this->db->f('item_type');
				$invoice_roleback[$i]['item_id']	= $this->db->f('item_id');

				if($this->db->f('oppsynsmannid'))
				{
					$invoice_roleback[$i]['oppsynsmannid']	= $this->db->f('oppsynsmannid');
				}
				if($this->db->f('saksbehandlerid'))
				{
					$invoice_roleback[$i]['saksbehandlerid']	= $this->db->f('saksbehandlerid');
				}

				$invoice_roleback[$i]['budsjettansvarligid']	= $this->db->f('budsjettansvarligid');

				if($this->db->f('oppsynsigndato'))
				{
					$invoice_roleback[$i]['oppsynsigndato']	= $this->db->f('oppsynsigndato');
				}
				if($this->db->f('saksigndato'))
				{
					$invoice_roleback[$i]['saksigndato']	= $this->db->f('saksigndato');
				}

				$invoice_roleback[$i]['budsjettsigndato']	= $this->db->f('budsjettsigndato');
				$invoice_roleback[$i]['merknad']	= $this->db->f('merknad');
				$invoice_roleback[$i]['splitt']	= $this->db->f('splitt');
				$invoice_roleback[$i]['ordrebelop']	= $this->db->f('ordrebelop');
				$invoice_roleback[$i]['utbetalingid']	= $this->db->f('utbetalingid');
				$invoice_roleback[$i]['utbetalingsigndato']	= $this->db->f('utbetalingsigndato');
				$i++;
			}
			return $invoice_roleback;
	    	}


		//rollback function
		function bilag_update_overf($BilagOverf)
		{
			$values= array(
				$BilagOverf['project_id'],
				$BilagOverf['kostra_id'],
				$BilagOverf['pmwrkord_code'],
				$BilagOverf['bilagsnr'],
				$BilagOverf['splitt'],
				$BilagOverf['kildeid'],
				$BilagOverf['kidnr'],
				$BilagOverf[typeid],
				$BilagOverf['fakturadato'],
				$BilagOverf['forfallsdato'],
				$BilagOverf['regtid'],
				$BilagOverf['artid'],
				$BilagOverf['spvend_code'],
				$BilagOverf['dimb'],
				$BilagOverf['oppsynsmannid'],
				$BilagOverf['saksbehandlerid'],
				$BilagOverf['budsjettansvarligid'],
				$BilagOverf['fakturanr'],
				$BilagOverf['spbudact_code'],
				$BilagOverf['dima'],
				$BilagOverf['loc1'],
				$BilagOverf['dimd'],
				$BilagOverf['mvakode'],
				$BilagOverf['periode'],
				$this->db->db_addslashes($BilagOverf['merknad']),
				$BilagOverf['utbetalingid'],
				$BilagOverf['oppsynsigndato'],
				$BilagOverf['saksigndato'],
				$BilagOverf['budsjettsigndato'],
				$BilagOverf['utbetalingsigndato'],
				$BilagOverf['item_type'],
				$BilagOverf['item_id'],
				);
			
			$values	= $this->bocommon->validate_db_insert($values);

			$sql= "INSERT INTO fm_ecobilag (project_id,kostra_id,pmwrkord_code,bilagsnr,splitt,kildeid,kidnr,typeid,"
			. " fakturadato,forfallsdato,regtid,artid,spvend_code,dimb,oppsynsmannid,"
			. " saksbehandlerid,budsjettansvarligid,fakturanr,spbudact_code,dima,loc1,dimd,mvakode,"
			. " periode,merknad,utbetalingid,oppsynsigndato,saksigndato,budsjettsigndato,utbetalingsigndato,item_type,item_id,belop,godkjentbelop)"
			. " values ($values,"
			. $this->bocommon->moneyformat($BilagOverf['belop']) . ","
			. $this->bocommon->moneyformat($BilagOverf['godkjentbelop']) . ")";

			$this->db->query($sql,__LINE__,__FILE__);
		}


   	   	//Oppdater belp p arbeidsordre operator="-" ved tilbakerulling
		function correct_actual_cost($pmwrkord_code,$Belop,$actual_cost_field,$operator)
		{
			$Belop=$Belop/100;
			
			if($operator == "-")
			{
				$update_paid = ", paid = 1";
			}
			else
			{
				$update_paid = ", paid = 2";
			}

			$sql="UPDATE fm_workorder SET $actual_cost_field=$actual_cost_field $operator $Belop $update_paid WHERE id='$pmwrkord_code'";
			$this->db->query($sql,__LINE__,__FILE__);
		}


		function overfor($download,$pre_transfer='',$force_period_year='')
		{

//			$download = 'on';
//			$download = False;
			$pre_transfer=True;
//			$this->debug=True;

			//Generer batch ID
			$batchid = $this->soXport->next_batchid();
			if ($download=='on')
			{
				$this->increment_batchid();
				//Lagre melding
				$this->log_start($batchid);
			}

			//Velg ut alle perioder som har bilag som skal overfres


			if ($pre_transfer)
			{
				$periode = $this->select_periods_with_invoice_to_transfer($pre_transfer);

				for ($i=0;$i<count($periode);$i++)
				{
	
					$receipt['message'][]= array('msg' => $this->OverforPeriode($batchid,$periode[$i],$download,$pre_transfer));
				}
			}


			$pre_transfer=False;
			
			$periode = $this->select_periods_with_invoice_to_transfer($pre_transfer);

			for ($i=0;$i<count($periode);$i++)
			{

				$receipt['message'][]= array('msg' => $this->OverforPeriode($batchid,$periode[$i],$download,$pre_transfer,$force_period_year));
			}



			//Lagre melding
			if ($download=='on' || $pre_transfer)
			{
				$this->log_end($batchid); //Lagre melding
			}

			return $receipt;
		}
		
		function errorhandler($error_desr)
		{
			$this->db->transaction_abort();

			$meld = $error_desr;
		
			//Vis feilmelding
//			echo $meld;
		
			//Lagre feilmelding
			$this->log_error($batchid,$error_desr);
		}
		
		function RullTilbake($Filnavn,$Dato)
		{								
			$dateformat = strtolower($GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']);
			$dateformat = str_replace(".","",$dateformat);
			$dateformat = str_replace("-","",$dateformat);
			$dateformat = str_replace("/","",$dateformat);
			$y=strpos($dateformat,'y');
			$d=strpos($dateformat,'d');
			$m=strpos($dateformat,'m');
	
	 		$dateparts = explode('/', $Dato);
	 		$day = $dateparts[$d];
	 		$month = $dateparts[$m];
	 		$year = $dateparts[$y];
	 /*		$date1 = mktime (2,0,0,$month,$day,$year);
			if ($date1)
			{
				$Dato=$date1;
			}
	
			$Dato= date("M d Y",$Dato);
	*/
			
			$BilagOverf=$this->select_invoice_rollback($day,$month,$year,$Filnavn);
			$this->db->transaction_begin();

			for ($i=0;$i<count($BilagOverf);$i++)
			{
				$this->bilag_update_overf($BilagOverf[$i]);
				
		
				if($BilagOverf[$i]['pmwrkord_code'])
				{
					if ($BilagOverf[$i]['artid']==1)
					{
						$Belop = sprintf("%01.2f", $BilagOverf[$i]['ordrebelop'])*100;
					}
					else
					{
						$Belop = sprintf("%01.2f", -$BilagOverf[$i]['ordrebelop'])*100;
					}
				
					if ($BilagOverf[$i]['dimd'] % 2 == 0)
					{
						$actual_cost_field='act_mtrl_cost';
					}
					else
					{
						$actual_cost_field='act_vendor_cost';
					}
		
					$operator='-';

					$this->correct_actual_cost($BilagOverf[$i]['pmwrkord_code'],$Belop,$actual_cost_field,$operator);
				}
		
				//Slett fra avviks tabell
			//	$this->soXport->delete_avvik($BilagOverf[$i]['bilagsnr']);
		
				//Slett fra arkiv
				$this->soXport->delete_invoice($BilagOverf[$i]['bilagsnr']);
		
				$antall = $antall + 1;
			}
		
			if($antall > 0)
			{		
				$fil_katalog = $this->config->config_data['export_path'];			
			
				if(unlink ($fil_katalog. SEP . $Filnavn))
				{
					$this->db->transaction_commit();
					$receipt['message'][]= array('msg' => $antall . ' ' . lang('bilag/underbilag rullet tilbake'));
					$receipt['message'][]= array('msg' => lang('File %1 is deleted',$Filnavn));
				}
				else
				{
					$this->db->transaction_abort();
					$receipt['message'][]= array('msg' => 'Noe gikk galt!');
				}							
			}
			else
			{
				$receipt['error'][]= array('msg' => lang('Sorry - None hits'));
			}
			return $receipt;
		}
				
		
		function LagFilnavn ($batchid,$pre_transfer='')
		{	
			if($pre_transfer)
			{
				$fil_katalog = $this->config->config_data['export_pre_path'];
			
				// Slett gamle filer

				if(!$this->old_files_deleted)
				{
				 	for ($i=0;$i<13;$i++)
				 	{
				 		@unlink($fil_katalog . '/FDA_' . $i. '.TXT');
				 	}
				 	
				 	$this->old_files_deleted= True;
				}


				$i = 1;
				do
				{
					$Filnavn = $fil_katalog . '/FDA_' . $i. '.TXT';
				
					//Sjekk om filen eksisterer
					If (!file_exists($Filnavn))
					{
						return $Filnavn;
					}
				
					$i++;
				}
				while  ($i < 13);

			}
			else
			{
				$fil_katalog = $this->config->config_data['export_path'];
				$continue = True;
				$i = 1;
				do
				{
					$Filnavn = $fil_katalog . '/FDB' . date("dmy") . '_' . sprintf("%02s",$i) . '.TXT';
				
					//Sjekk om filen eksisterer
					If (!file_exists($Filnavn))
					{
						return $Filnavn;
					}
				
					$i++;
				}
				while  ($continue);
			}
			
			
			//Ingen lpenr er ledige, gi feilmelding
			return False;
		}
		
		function OverforPeriode($batchid,$periode,$download,$pre_transfer='',$force_period_year='')
		{
			$BilagId = 'NULL';
	
			//Bestem filnavn
			
			$this->db->transaction_begin();

			$Filnavn = $this->LagFilnavn($batchid,$pre_transfer);
			if (!$Filnavn)
			{
				$message='LagFilnavn'.lang('Alle lpenr for filnavn er i bruk!');
				$this->errorhandler($message);
				return $message;
			}

			//Test om filen kan opprettes og skrives til
			if (@fopen($Filnavn, "wb"))
			{
				unlink($Filnavn);
			}
			else
			{
				$message='kan ikke lagre til fil: '. $Filnavn .'<br>';
				return $message;
			}
			
			//Velg ut alle hoved bilag som skal overfres

			$oRsBilag=$this->soXport->hoved_bilag($periode,$pre_transfer);
									
		 	$bilag_count= count($oRsBilag);
		 	for ($k=0;$k<$bilag_count;$k++)
			{				
				$tranfser_bilag[] = $oRsBilag[$k]['bilagsnr'];
				
				//Bestem belops felt
				if ($oRsBilag[$k]['splitt']==0)
				{
					//Bilaget er ikke splittet
					if ($oRsBilag[$k]['godkjentbelop'] <> $oRsBilag[$k]['belop'])
					{
						$BelopFelt = 'godkjentbelop';			
						//Logg til avviks tabell
						if ($download=='on' && !$pre_transfer)
						{
//							$this->soXport->log_to_deviation_table($oRsBilag[$k]);
						}
					}
					else
					{
						$BelopFelt = 'belop';
					}
				}
				
				//Bilaget er splittet
				if ($oRsBilag[$k]['godkjentbelop'] == $oRsBilag[$k]['belop'])
				{
					$BelopFelt = 'godkjentbelop';
				}
				else
				{
					 //Ikke lovlig
					$message = lang('Avvik mellom fakturabelp og godkjent belp p splittet faktura!');
					$this->errorhandler($message);
					return $message;
				}
		
				$Belop_motpost =$oRsBilag[$k][$BelopFelt] *100; 

				//Skriv hovedbilag

				$Buntnr		= sprintf("%-12s",basename($Filnavn,".TXT"));// verdi: MMDDFL, type: c12, plass: 1 - 12
				$Forsystem	= 'BI';// verdi: BI, type: c2, plass: 13 - 14
				
				$Transtype	= 'GL';// verdi: GL, type: c2, plass: 17 - 18
				$Firmakode	= sprintf("%-2s",'BB');// verdi: Firmakode, type: c2, plass: 19 - 20

				$Valuteringsdato= date(Ymd,strtotime($oRsBilag[$k]['fakturadato']));// verdi: Dato, type: date, plass: 251 - 258
				$Bilagsdato	= date(Ymd,strtotime($oRsBilag[$k]['fakturadato'])) ;// verdi: Dato, type: date, plass: 259 - 266
				$Bilagsnr	= sprintf("%-9s",substr($oRsBilag[$k]['bilagsnr'],-8));// verdi: Bilagsnummer, type: i4, plass: 267 - 275
		//		$Periode	= sprintf("%06s",date(Y,strtotime($oRsBilag[$k]['fakturadato'])) . sprintf("%02d",$periode));// verdi: Periode, type: i4, plass: 276 - 281
				$ESL		= sprintf("%1s",'');// verdi: Blank, type: i+C481, plass: 282 - 282

				if($pre_transfer)
				{
					if(abs(date(m,time()) - $periode) >1)
					{
						$temp_period = date(m,time()) -1;
					
						if($temp_period == 0)
						{
							$temp_period =1;
						}
						
						$temp_year = date(Y,time());
					}
					else
					{
						$temp_period = $periode;
						$temp_year = date(Y,strtotime($oRsBilag[$k]['fakturadato']));
					}

					$Periode	= sprintf("%06s",$temp_year . sprintf("%02d",$temp_period));// verdi: Periode, type: i4, plass: 276 - 281
					$Bilagsart	= sprintf("%2s",'FF');// verdi: , type: c2, plass: 15 - 16
					$Forfall	= '20991231';// verdi: Forfallsdato , type: date, plass: 298 - 305				
				}
				else
				{

					if($force_period_year)
					{
						$Periode	= sprintf("%06s",$force_period_year . sprintf("%02d",$periode));// verdi: Periode, type: i4, plass: 276 - 281
					}
					else
					{
						$Periode	= sprintf("%06s",date(Y,strtotime($oRsBilag[$k]['fakturadato'])) . sprintf("%02d",$periode));// verdi: Periode, type: i4, plass: 276 - 281
					}
					
					$Bilagsart	= sprintf("%2s",'FD');// verdi: , type: c2, plass: 15 - 16
					$Forfall	= date(Ymd,strtotime($oRsBilag[$k]['forfallsdato']));// verdi: Forfallsdato , type: date, plass: 298 - 305				
				}
				
				$Rab_forf	= sprintf("%-8s",'');// verdi: Blank, type: date, plass: 306 - 313
				$Rabatt		= sprintf("%020s",'');// verdi: Blank, type: money, plass: 314 - 333
				$Avt_Kon	= sprintf("%-8s",'');// verdi: Blank, type: c8, plass: 334 - 341

				$Kid		= sprintf("%-27s",$oRsBilag[$k]['kidnr']);// verdi: Kid, type: c27, plass: 351 - 377
				$Bet_overforing	= sprintf("%-2s",'');// verdi: Blank, type: c2, plass: 378 - 379
				$Status		= 'N';// verdi: N, type: c1, plass: 380 - 380
				$Resk_type	= 'P';// verdi: Blank, type: c1, plass: 381 - 381
				$Resk_nr	= sprintf("%-9s",$oRsBilag[$k]['spvend_code']);// verdi: Blank., type: i4, plass: 382 - 390
				$Forskudd	= '0';// verdi: 0, type: i1, plass: 391 - 391
				$Fakturaref	= '000000000';// verdi: 0, type: i4, plass: 392 - 400
				$Fakturaref	= '000000000';// verdi: 0, type: i4, plass: 401 - 409
				$Inkassokode	= sprintf("%-6s",'');// verdi: Blank, type: c6, plass: 410 - 415
				$Bet_mottager	= sprintf("%-8s",'');// verdi: Blank, type: c8, plass: 416 - 423
				$Att_ansvarlig	= sprintf("%-6s",$oRsBilag[$k]['saksbehandler']);// verdi: Blank, type: c6, plass: 424 - 429

				$vendor_info = $this->get_vendor_info($oRsBilag[$k]['spvend_code']);
				
				if(!$vendor_info['org_nr'])
				{
					$message = 'mangler org_nr for reskontronr: ' . $oRsBilag[$k]['spvend_code'];
					$this->errorhandler($message);
					return $message;
				}

				if(!$vendor_info['konto_nr'])
				{
					$message = 'mangler konto for reskontronr: ' . $oRsBilag[$k]['spvend_code'];
					$this->errorhandler($message);
					return $message;
				}

				$Resk_navn	= sprintf("%-50s",$vendor_info['org_nr']);// verdi: Fdselsnr, type: c50, plass: 430 - 479
				$Postadresse	= sprintf("%-160s",'');// verdi: Blank, type: c160, plass: 480 - 639
				$Stat_Provins	= sprintf("%-50s",'');// verdi: Blank, type: c50, plass: 640 - 689
				$Sted		= sprintf("%-50s",'');// verdi: Blank, type: c50, plass: 690 - 739
				$Bank_Postgiro_kontonr = sprintf("%-35s",str_replace(" ","",$vendor_info['konto_nr']));// verdi: konto_nr, type: c35, plass: 740 - 774
				$Betalingsmte	= sprintf("%-2s",'');// verdi: Blank, type: c2, plass: 775 - 776
				$Mva_reg_nr	= sprintf("%-25s",'');// verdi: Blank, type: c25, plass: 777 - 801
				$Postnummer	= sprintf("%-15s",'');// verdi: Blank, type: c15, plass: 802 - 816
				$Val_dok	= sprintf("%-3s",'');// verdi: Blank, type: c3, plass: 817 - 819


				//Velg ut alle underbilag
				$oRsUnderbilag=$this->soXport->select_underbilag($oRsBilag[$k]['bilagsnr']);		


				$underbilag_count= count($oRsUnderbilag);
				$last_record = $underbilag_count - 1;

				for ($i=0;$i<$underbilag_count;$i++)
				{
					$BilagId = $oRsUnderbilag[$i]['id'];
					
					$Belop = $oRsUnderbilag[$i][$BelopFelt]*100;
					$Belop_ = $Belop;
					
					if($Belop < 0)
					{
						$Belop = abs($Belop);
						$Belop = sprintf("%019s",$Belop);

						if ($oRsUnderbilag[$i]['artid'] == 2)
						{		
							$Belop = '+' . $Belop;
	
						}
						else
						{
							$Belop = '-' . $Belop;
						}

					}
					else
					{					
						$Belop = sprintf("%019s",$Belop);
					
						if ($oRsUnderbilag[$i]['artid'] == 2)
						{		
							$Belop = '-' . $Belop;

						}
						else
						{
							$Belop = '+' . $Belop;
						}
					}
					

					if($oRsUnderbilag[$i]['pmwrkord_code'])
					{
		
						//Oppdater belp p arbeidsordre
						if ($download=='on' && !$pre_transfer)
						{
							if ($oRsUnderbilag[$i]['dimd'] % 2 == 0)
							{
								$actual_cost_field='act_mtrl_cost';
							}
							else
							{
								$actual_cost_field='act_vendor_cost';
							}
							$operator='+';
							
							if(!$this->debug)
							{
								$this->correct_actual_cost($oRsUnderbilag[$i]['pmwrkord_code'],$Belop_,$actual_cost_field,$operator);
							}
						}
					}
		
					//Overfr til fm_ecobilagoverf
		
					$oRsOverfBilag=$oRsUnderbilag[$i];
					$oRsOverfBilag['filnavn']= basename($Filnavn);
					$oRsOverfBilag['ordrebelop']=$oRsUnderbilag[$i][$BelopFelt];


					//dersom det mangler budsjett konto - kun aktuelt for ikke godkjent - sett konto til 2899999
					
					if(!$oRsOverfBilag['spbudact_code'] && $pre_transfer)
					{
						$oRsOverfBilag['spbudact_code'] = 12304361;
					}
					
					
					//dersom ikke gyldig objekt - kun aktuelt for ikke godkjent - sett objekt til 9999
					
					if(!($oRsOverfBilag['kostra_id']>0) && $pre_transfer)
					{
						$oRsOverfBilag['kostra_id'] = 26550;
						$oRsOverfBilag['mvakode'] = 0;
						$oRsOverfBilag['dima'] = 9999;
					}
					
					$Konto		= sprintf("%-8s",$oRsOverfBilag['spbudact_code']);// verdi: Art, type: c8, plass: 21 - 28
					$Dim_1		= sprintf("%8s",$oRsOverfBilag['district_id']);// verdi: Ansvarssted, type: c8, plass: 29 - 36
					$Dim_2		= sprintf("%-8s",$oRsOverfBilag['kostra_id']);// verdi: Tjeneste, type: c8, plass: 37 - 44
					
					if($pre_transfer)
					{
						$Dim_3		= sprintf("%-8s",substr($oRsOverfBilag['dima'],0,4));// verdi: Objekt, type: c8, plass: 45 - 52
					}
					else
					{
						$Dim_3		= sprintf("%-8s",substr($oRsOverfBilag['dima'],0,6));// verdi: Objekt-bygg, type: c8, plass: 45 - 52
					}
					
					
					$Dim_4		= sprintf("%-8s",'');// verdi: Ressurs, type: c8, plass: 53 - 60
					$Dim_5		= sprintf("%-12s",$oRsOverfBilag['project_id']);// verdi: Prosjekt, type: c12, plass: 61 - 72
					$Dim_6		= sprintf("%-4s",$oRsOverfBilag['dimd']);// verdi: Blank, type: c4, plass: 73 - 76
					$Dim_7		= sprintf("%-4s",'');// verdi: Blank, type: c4, plass: 77 - 80

					$Avgiftskode=sprintf("%-2s",$oRsOverfBilag['mvakode']);// verdi: Avgiftskode, type: c2, plass: 81 - 82
					
					$Avgiftssystem	= sprintf("%2s",'');// verdi: Blank, type: c2, plass: 83 - 84
					$Valutakode	='NOK';// verdi: NOK, type: c3, plass: 85 - 87
					$Debet_Kredit	= sprintf("%2s",'');// verdi: Blank, type: i2, plass: 88 - 89
					$Valutabelop	= $Belop;// verdi: Belp, type: money, plass: 90 - 109
					$Belop_i_firmavaluta=$Belop;// verdi: Belp, type: money, plass: 110 - 129
					$Antall		= sprintf("%11s",'');// verdi: Blank, type: i4, plass: 130 - 140
					$Belop2		= sprintf("%20s",'');// verdi: Blank, type: f8, plass: 141 - 160
					$Belop3		= sprintf("%20s",'');// verdi: Blank, type: money, plass: 161 - 180

				//	$Belop4 (ogs kalt "money3" )blir brukt for identifisere overfring p tvers av filer.
					$Belop4		= sprintf("%20s",$batchid);// verdi: Blank, type: money, plass: 181 - 200 - batch_id hyre justert


					if($oRsOverfBilag['pmwrkord_code'])
					{
						$Tekst	= sprintf("%-50s",substr($this->get_order_title($oRsOverfBilag['pmwrkord_code']),0,50));//sprintf("%-50s",substr($oRsOverfBilag['merknad'],0,50));// verdi: Tekst, type: text (50), plass: 201 - 250
					}
					else
					{
						$Tekst	= sprintf("%-50s",'');//sprintf("%-50s",substr($oRsOverfBilag['merknad'],0,50));// verdi: Tekst, type: text (50), plass: 201 - 250
					}
					
					$Fakturanr	= sprintf("%-15s",$oRsOverfBilag['fakturanr']);// verdi: Fakturanr, type: c15, plass: 283 - 297

					$Ordrenummer	= sprintf("%-9s",$oRsOverfBilag['pmwrkord_code']);// verdi: Infodoc ordrenr, type: i4, plass: 342 - 350
	
					
					//Kopier verdier
					if ($download=='on' && !$pre_transfer && !$this->debug)
					{
						$this->soXport->add_OverfBilag($oRsOverfBilag);
					}
					
					//Skriv til fil
					
					$buffer .= $Buntnr . $Forsystem . $Bilagsart . $Transtype . $Firmakode . $Konto . $Dim_1 . $Dim_2 . $Dim_3 . $Dim_4 . 
					$Dim_5 . $Dim_6 . $Dim_7 . $Avgiftskode . $Avgiftssystem . $Valutakode . $Debet_Kredit . $Valutabelop . 
					$Belop_i_firmavaluta . $Antall . $Belop2 . $Belop3 . $Belop4 . $Tekst . $Valuteringsdato . $Bilagsdato . 
					$Bilagsnr . $Periode . $ESL . $Fakturanr . $Forfall . $Rab_forf . $Rabatt . $Avt_Kon . $Ordrenummer . 
					$Kid . $Bet_overforing . $Status . $Resk_type . $Resk_nr . $Forskudd . $Fakturaref . $Fakturaref . 
					$Inkassokode . $Bet_mottager . $Att_ansvarlig . $Resk_navn . $Postadresse . $Stat_Provins . $Sted . 
					$Bank_Postgiro_kontonr . $Betalingsmte . $Mva_reg_nr . $Postnummer . $Val_dok ."\r\n";

					if($i==$last_record)
					{
						$Konto		= sprintf("%-8s",'2327010');// verdi: Art, type: c8, plass: 21 - 28
						$Dim_1		= sprintf("%-8s",'');// verdi: Ansvarssted, type: c8, plass: 29 - 36
						$Dim_2		= sprintf("%-8s",'');// verdi: Tjeneste, type: c8, plass: 37 - 44
						$Dim_3		= sprintf("%-8s",'');// verdi: Objekt, type: c8, plass: 45 - 52
						$Dim_4		= sprintf("%-8s",'');// verdi: Ressurs, type: c8, plass: 53 - 60
						$Dim_5		= sprintf("%-12s",'');// verdi: Prosjekt, type: c12, plass: 61 - 72
						$Dim_6		= sprintf("%-4s",'');// verdi: Blank, type: c4, plass: 73 - 76
						$Dim_7		= sprintf("%-4s",'');// verdi: Blank, type: c4, plass: 77 - 80
						$Fakturanr	= sprintf("%-15s",'');// verdi: Fakturanr, type: c15, plass: 283 - 297
						$Ordrenummer	= sprintf("%-9s",'');// verdi: Infodoc ordrenr, type: i4, plass: 342 - 350
						$Tekst		= sprintf("%-50s",'');//sprintf("%-50s",substr($oRsOverfBilag['merknad'],0,50));// verdi: Tekst, type: text (50), plass: 201 - 250

						if($Belop_motpost < 0)
						{
							$Belop_motpost = sprintf("%019s",abs($Belop_motpost));

							if ($oRsUnderbilag[$i]['artid'] == 2)
							{		
								$Belop_motpost = '-' . $Belop_motpost;
		
							}
							else
							{
								$Belop_motpost = '+' . $Belop_motpost;
							}
						}
						else
						{
							$Belop_motpost = sprintf("%019s",$Belop_motpost);

							if ($oRsUnderbilag[$i]['artid'] == 2)
							{		
								$Belop_motpost = '+' . $Belop_motpost;
	
							}
							else
							{
								$Belop_motpost = '-' . $Belop_motpost;
							}
						}
						
						$Transtype	= 'AP';// verdi: GL, type: c2, plass: 17 - 18
						$Valutabelop	= $Belop_motpost;// verdi: Belp, type: money, plass: 90 - 109
						$Belop_i_firmavaluta=$Belop_motpost;// verdi: Belp, type: money, plass: 110 - 129

						$buffer .= $Buntnr . $Forsystem . $Bilagsart . $Transtype . $Firmakode . $Konto . $Dim_1 . $Dim_2 . $Dim_3 . $Dim_4 . 
						$Dim_5 . $Dim_6 . $Dim_7 . $Avgiftskode . $Avgiftssystem . $Valutakode . $Debet_Kredit . $Valutabelop . 
						$Belop_i_firmavaluta . $Antall . $Belop2 . $Belop3 . $Belop4 . $Tekst . $Valuteringsdato . $Bilagsdato . 
						$Bilagsnr . $Periode . $ESL . $Fakturanr . $Forfall . $Rab_forf . $Rabatt . $Avt_Kon . $Ordrenummer . 
						$Kid . $Bet_overforing . $Status . $Resk_type . $Resk_nr . $Forskudd . $Fakturaref . $Fakturaref . 
						$Inkassokode . $Bet_mottager . $Att_ansvarlig . $Resk_navn . $Postadresse . $Stat_Provins . $Sted . 
						$Bank_Postgiro_kontonr . $Betalingsmte . $Mva_reg_nr . $Postnummer . $Val_dok ."\r\n";					
					}
				
					//Slett post i fm_ecobilag
					if ($download=='on' && !$pre_transfer && !$this->debug)
					{
						$this->soXport->delete_from_fm_ecobilag($oRsUnderbilag[$i]['id']);		
						//Logg transaksjon		
						$this->soXport->log_transaction($batchid,$BilagId,lang('Invoice tranferred'));
					}
		
					$BilagId = 'NULL';
		
					$antall = $antall + 1;
				}
			}
				
			//Fullfr transaksjon
			
		
			if ($download=='on' && !$pre_transfer && !$this->debug):
			{
				$fp = fopen($Filnavn, "wb");
				fwrite($fp,$buffer);
				
				if(fclose($fp))
				{
					$file_written=True;
				}

				if($file_written && $this->config->config_data['invoice_export_method']!='ftp'):
				{
					$transfer_ok = True;
				}
				elseif($file_written):
				{
					$transfer_ok = $this->transfer($buffer,$Filnavn,$batchid,$tranfser_bilag);
				}
				endif;

				if($transfer_ok)
				{
					$this->db->transaction_commit();
					$message = 'Godkjent: periode: '.$Periode.' antall bilag/underbilag overfrt:'.$antall . ' , fil: ' . $Filnavn;
				}
				else
				{
					$this->db->transaction_abort();
					$message = 'Noe gikk galt med overfring av godkjendte fakturaer!';				
				}
			}
			elseif($download=='on' && $pre_transfer && !$this->debug):
			{

				$fp = fopen($Filnavn, "wb");
				fwrite($fp,$buffer);

				if(fclose($fp))
				{
					$file_written=True;
				}
				
				if($file_written && $this->config->config_data['invoice_export_method']!='ftp'):
				{
					$transfer_ok = True;
				}
				elseif($file_written):
				{
					$transfer_ok = $this->transfer($buffer,$Filnavn,$batchid,$tranfser_bilag);
				}
				endif;

				if($transfer_ok)
				{
					$this->db->transaction_commit();
					$message = 'Ankomstregistrering: periode: '.$Periode.' antall bilag/underbilag overfrt:'.$antall . ' , fil: ' . $Filnavn;
				}
				else
				{
					$this->db->transaction_abort();
					$message = 'Noe gikk galt med ankomstregistrering!';				
				}
			}
			else:
			{
				$message = $buffer;
				$this->db->transaction_abort();

			}
			endif;

			return $message;
		}
		
		function transfer($buffer,$Filnavn,$batchid,$tranfser_bilag)
		{			

			if($this->config->config_data['invoice_export_method']=='ftp')
			{
				$ftp	= $this->phpftp_connect();	
				
				$basedir = $this->config->config_data['invoice_ftp_basedir'];
				if($basedir)
				{
					$newfile = $basedir . '/' . basename($Filnavn);
				}
				else
				{
					$newfile = basename($Filnavn);
				}

				if (ftp_put($ftp,$newfile, $Filnavn, FTP_BINARY))
				{
				 	for ($i=0;$i<count($tranfser_bilag);$i++)
					{				
						$this->soXport->log_transaction($batchid,$tranfser_bilag[$i],lang('Invoice pre_transferred %1',basename($Filnavn)));
					}
					$transfer_ok = True;
				}
				else
				{
				 	for ($i=0;$i<count($tranfser_bilag);$i++)
					{				
						$this->soXport->log_transaction($batchid,$tranfser_bilag[$i],lang('Failed to pre_transfere %1 to agresso',basename($Filnavn)));
					}
					$transfer_ok = False;
				}
				if(!$transfer_ok)
				{
					unlink($Filnavn);
				}
			
				ftp_quit($ftp);
			}
			return 	$transfer_ok;
		}

		function phpftp_connect() 
		{
			$host = $this->config->config_data['invoice_ftp_host'];
			$user = $this->config->config_data['invoice_ftp_user'];
			$pass = $this->config->config_data['invoice_ftp_pw'];
			
//			echo "connecting to $host with $user and $pass\n <br>";
			$ftp = ftp_connect($host);
			if($ftp) 
			{
				if (ftp_login($ftp,$user,$pass)) 
				{
					return $ftp;
				}
			}
		}
	}
?>
