2018-08-09 10:14:26 +02:00
< ? php
namespace Modules\Anagrafiche ;
2018-10-05 11:22:32 +02:00
use Common\Model ;
2018-08-09 10:14:26 +02:00
use Modules\Fatture\Fattura ;
2018-12-29 12:03:22 +01:00
use Settings ;
2018-11-30 19:40:06 +01:00
use Traits\RecordTrait ;
2018-09-24 18:10:16 +02:00
use Util\Generator ;
2018-08-09 10:14:26 +02:00
class Anagrafica extends Model
{
2018-11-30 19:40:06 +01:00
use RecordTrait ;
2018-08-09 10:14:26 +02:00
protected $table = 'an_anagrafiche' ;
protected $primaryKey = 'idanagrafica' ;
2018-11-30 19:40:06 +01:00
protected $module = 'Anagrafiche' ;
2018-11-09 11:34:27 +01:00
protected $guarded = [];
2018-08-09 10:14:26 +02:00
2018-09-24 18:10:16 +02:00
protected $appends = [
'id' ,
'partita_iva' ,
];
protected $hidden = [
'idanagrafica' ,
'piva' ,
];
/**
2018-09-25 16:47:44 +02:00
* Crea una nuova anagrafica .
2018-09-24 18:10:16 +02:00
*
2018-09-25 16:47:44 +02:00
* @ param string $ragione_sociale
* @ param array $tipologie
*
* @ return self
2018-09-24 18:10:16 +02:00
*/
2019-01-02 14:15:16 +01:00
public static function build ( $ragione_sociale , array $tipologie = [])
2018-09-24 18:10:16 +02:00
{
2019-01-02 14:15:16 +01:00
$model = parent :: build ();
2018-09-24 18:10:16 +02:00
2018-09-25 16:47:44 +02:00
$model -> ragione_sociale = $ragione_sociale ;
2018-09-24 18:10:16 +02:00
$ultimo = database () -> fetchOne ( 'SELECT codice FROM an_anagrafiche ORDER BY CAST(codice AS SIGNED) DESC LIMIT 1' );
$codice = Generator :: generate ( setting ( 'Formato codice anagrafica' ), $ultimo [ 'codice' ]);
$model -> codice = $codice ;
$model -> save ();
2018-11-09 11:34:27 +01:00
$model -> tipologie = $tipologie ;
2018-09-26 15:37:46 +02:00
$model -> save ();
2018-09-24 18:10:16 +02:00
return $model ;
}
public static function fixAzienda ( Anagrafica $anagrafica )
{
Settings :: setValue ( 'Azienda predefinita' , $anagrafica -> id );
}
public static function fixCliente ( Anagrafica $anagrafica )
{
$database = database ();
// Creo il relativo conto nel partitario se non esiste
if ( empty ( $anagrafica -> idconto_cliente )) {
// Calcolo prossimo numero cliente
$rs = $database -> fetchArray ( " SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Crediti clienti e crediti diversi' " );
$new_numero = $rs [ 0 ][ 'max_numero' ] + 1 ;
$new_numero = str_pad ( $new_numero , 6 , '0' , STR_PAD_LEFT );
$database -> query ( 'INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES(' . prepare ( $new_numero ) . ', ' . prepare ( post ( 'ragione_sociale' )) . " , (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi'), 1, 1) " );
$idconto = $database -> lastInsertedID ();
// Collegamento conto
$anagrafica -> idconto_cliente = $idconto ;
$anagrafica -> save ();
}
}
public static function fixFornitore ( Anagrafica $anagrafica )
{
$database = database ();
// Creo il relativo conto nel partitario se non esiste
if ( empty ( $anagrafica -> idconto_fornitore )) {
// Calcolo prossimo numero cliente
$rs = $database -> fetchArray ( " SELECT MAX(CAST(co_pianodeiconti3.numero AS UNSIGNED)) AS max_numero FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti2.descrizione='Debiti fornitori e debiti diversi' " );
$new_numero = $rs [ 0 ][ 'max_numero' ] + 1 ;
$new_numero = str_pad ( $new_numero , 6 , '0' , STR_PAD_LEFT );
$database -> query ( 'INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, can_delete, can_edit) VALUES(' . prepare ( $new_numero ) . ', ' . prepare ( post ( 'ragione_sociale' )) . " , (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi'), 1, 1) " );
$idconto = $database -> lastInsertedID ();
// Collegamento conto
$anagrafica -> idconto_fornitore = $idconto ;
$anagrafica -> save ();
}
}
public static function fixTecnico ( Anagrafica $anagrafica )
{
// Copio già le tariffe per le varie attività
2018-10-12 10:33:08 +02:00
$result = database () -> query ( 'INSERT INTO in_tariffe(idtecnico, idtipointervento, costo_ore, costo_km, costo_dirittochiamata, costo_ore_tecnico, costo_km_tecnico, costo_dirittochiamata_tecnico) SELECT ' . prepare ( $model -> id ) . ', idtipointervento, costo_orario, costo_km, costo_diritto_chiamata, costo_orario_tecnico, costo_km_tecnico, costo_diritto_chiamata_tecnico FROM in_tipiintervento' );
2018-09-24 18:10:16 +02:00
2018-10-05 11:22:32 +02:00
if ( ! $result ) {
flash () -> error ( tr ( " Errore durante l'importazione tariffe! " ));
2018-09-24 18:10:16 +02:00
}
}
/**
* Aggiorna la tipologia dell ' anagrafica .
*
* @ param array $tipologie
*/
2018-11-09 11:34:27 +01:00
public function setTipologieAttribute ( array $tipologie )
2018-09-24 18:10:16 +02:00
{
if ( $this -> isAzienda ()) {
$tipologie [] = Tipo :: where ( 'descrizione' , 'Azienda' ) -> first () -> id ;
}
2018-11-09 11:34:27 +01:00
$tipologie = array_clean ( $tipologie );
2018-09-24 18:10:16 +02:00
$previous = $this -> tipi () -> get ();
$this -> tipi () -> sync ( $tipologie );
$actual = $this -> tipi () -> get ();
$diff = $actual -> diff ( $previous );
foreach ( $diff as $tipo ) {
$method = 'fix' . $tipo -> descrizione ;
if ( method_exists ( $this , $method )) {
self :: $method ( $this );
}
}
}
/**
* Controlla se l 'anagrafica è di tipo ' Azienda ' .
*
* @ return bool
*/
public function isAzienda ()
{
return $this -> tipi () -> get () -> search ( function ( $item , $key ) {
return $item -> descrizione == 'Azienda' ;
2018-09-25 16:47:44 +02:00
}) !== false ;
2018-09-24 18:10:16 +02:00
}
/**
* Restituisce l ' identificativo .
*
* @ return int
*/
public function getIdAttribute ()
{
return $this -> idanagrafica ;
}
public function setCodiceAttribute ( $value )
{
if ( self :: where ([
[ 'codice' , $value ],
2018-09-25 16:47:44 +02:00
[ $this -> primaryKey , '<>' , $this -> id ],
2018-09-24 18:10:16 +02:00
]) -> count () == 0 ) {
$this -> attributes [ 'codice' ] = $value ;
}
}
public function getPartitaIvaAttribute ()
{
return $this -> piva ;
}
public function setPartitaIvaAttribute ( $value )
{
$this -> attributes [ 'piva' ] = trim ( strtoupper ( $value ));
}
public function setCodiceFiscaleAttribute ( $value )
{
$this -> attributes [ 'codice_fiscale' ] = trim ( strtoupper ( $value ));
}
2018-11-09 07:02:59 +01:00
public function setCodiceDestinatarioAttribute ( $value )
{
2018-11-09 13:20:56 +01:00
if ( empty ( $this -> tipo ) || $this -> tipo == 'Privato' || in_array ( $value , [ '999999' , '0000000' ]) || $this -> sedeLegale -> nazione -> iso2 != 'IT' ) {
2018-11-09 07:02:59 +01:00
$codice_destinatario = '' ;
} else {
$codice_destinatario = $value ;
}
$this -> attributes [ 'codice_destinatario' ] = trim ( strtoupper ( $codice_destinatario ));
}
2018-09-24 18:10:16 +02:00
public function tipi ()
{
return $this -> belongsToMany ( Tipo :: class , 'an_tipianagrafiche_anagrafiche' , 'idanagrafica' , 'idtipoanagrafica' );
}
2018-08-09 10:14:26 +02:00
public function fatture ()
{
return $this -> hasMany ( Fattura :: class , 'idanagrafica' );
}
2018-09-24 18:10:16 +02:00
public function nazione ()
{
return $this -> belongsTo ( Nazione :: class , 'id_nazione' );
}
/**
* Restituisce la sede legale collegata .
*
* @ return self
*/
2018-11-09 11:34:27 +01:00
public function getSedeLegaleAttribute ()
2018-09-24 18:10:16 +02:00
{
return $this ;
}
2018-08-09 10:14:26 +02:00
}