2018-08-09 10:14:26 +02:00
< ? php
namespace Modules\Anagrafiche ;
2018-10-05 11:22:32 +02:00
use Common\Model ;
2020-02-24 12:21:47 +01:00
use Illuminate\Database\Eloquent\Builder ;
2019-07-08 12:25:51 +02:00
use Illuminate\Database\Eloquent\SoftDeletes ;
2019-09-13 11:29:45 +02:00
use Modules\Contratti\Contratto ;
use Modules\DDT\DDT ;
2018-08-09 10:14:26 +02:00
use Modules\Fatture\Fattura ;
2019-09-13 11:29:45 +02:00
use Modules\Ordini\Ordine ;
use Modules\Preventivi\Preventivo ;
2019-07-08 15:48:48 +02:00
use Modules\TipiIntervento\Tipo as TipoSessione ;
2019-09-13 11:29:45 +02:00
use Plugins\DichiarazioniIntento\Dichiarazione ;
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
{
2019-07-11 17:20:58 +02:00
use RecordTrait ;
use SoftDeletes ;
2018-11-30 19:40:06 +01:00
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
*
* @ return self
2018-09-24 18:10:16 +02:00
*/
2019-04-19 03:18:05 +02:00
public static function build ( $ragione_sociale , $nome = '' , $cognome = '' , 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
2019-04-19 03:18:05 +02:00
$model -> nome = $nome ;
$model -> cognome = $cognome ;
2019-07-04 21:03:33 +02:00
$model -> codice = static :: getNextCodice ();
2019-02-18 09:25:18 +01:00
$model -> id_ritenuta_acconto_vendite = setting ( " Percentuale ritenuta d'acconto " );
2018-09-24 18:10:16 +02:00
$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 ;
}
2019-07-08 12:25:51 +02:00
public static function fromTipo ( $type )
{
2019-07-08 12:24:59 +02:00
$tipologia = Tipo :: where ( 'descrizione' , 'Tecnico' ) -> first ();
$anagrafiche = self :: whereHas ( 'tipi' , function ( $query ) use ( $tipologia ) {
$query -> where ( 'an_tipianagrafiche.idtipoanagrafica' , '=' , $tipologia -> id );
});
return $anagrafiche ;
}
2018-09-24 18:10:16 +02:00
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 );
2019-12-27 17:40:56 +01:00
$database -> query ( 'INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2) VALUES(' . prepare ( $new_numero ) . ', ' . prepare ( $anagrafica -> ragione_sociale ) . " , (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Crediti clienti e crediti diversi')) " );
2018-09-24 18:10:16 +02:00
$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 );
2019-12-27 17:40:56 +01:00
$database -> query ( 'INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2) VALUES(' . prepare ( $new_numero ) . ', ' . prepare ( $anagrafica -> ragione_sociale ) . " , (SELECT id FROM co_pianodeiconti2 WHERE descrizione='Debiti fornitori e debiti diversi')) " );
2018-09-24 18:10:16 +02:00
$idconto = $database -> lastInsertedID ();
// Collegamento conto
$anagrafica -> idconto_fornitore = $idconto ;
$anagrafica -> save ();
}
}
public static function fixTecnico ( Anagrafica $anagrafica )
{
2019-07-08 12:24:59 +02:00
$database = database ();
$presenti = $database -> fetchArray ( 'SELECT idtipointervento AS id FROM in_tariffe WHERE idtecnico = ' . prepare ( $anagrafica -> id ));
2018-09-24 18:10:16 +02:00
2019-07-08 15:48:48 +02:00
// Aggiunta associazioni costi unitari al contratto
$tipi = TipoSessione :: whereNotIn ( 'idtipointervento' , array_column ( $presenti , 'id' )) -> get ();
foreach ( $tipi as $tipo ) {
$database -> insert ( 'in_tariffe' , [
'idtecnico' => $anagrafica -> id ,
'idtipointervento' => $tipo -> id ,
'costo_ore' => $tipo -> costo_orario ,
'costo_km' => $tipo -> costo_km ,
'costo_dirittochiamata' => $tipo -> costo_diritto_chiamata ,
'costo_ore_tecnico' => $tipo -> costo_orario_tecnico ,
'costo_km_tecnico' => $tipo -> costo_km_tecnico ,
'costo_dirittochiamata_tecnico' => $tipo -> costo_diritto_chiamata_tecnico ,
]);
2018-09-24 18:10:16 +02:00
}
}
/**
* Aggiorna la tipologia dell ' anagrafica .
*/
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 ()
{
2019-07-10 17:22:39 +02:00
return $this -> isTipo ( 'Azienda' );
}
/**
* Controlla se l 'anagrafica è di tipo ' Azienda ' .
*
* @ return bool
*/
public function isTipo ( $type )
{
return $this -> tipi () -> get () -> search ( function ( $item , $key ) use ( $type ) {
return $item -> descrizione == $type ;
2018-09-25 16:47:44 +02:00
}) !== false ;
2018-09-24 18:10:16 +02:00
}
2019-09-13 11:29:45 +02:00
public function delete ()
{
if ( ! $this -> isAzienda ()) {
return parent :: delete ();
}
}
2019-09-19 16:17:17 +02:00
public function save ( array $options = [])
{
$this -> fixRagioneSociale ();
return parent :: save ( $options );
}
2019-09-13 11:29:45 +02:00
// Attributi Eloquent
2020-03-03 10:33:32 +01:00
public function getModuleAttribute ()
{
return 'Anagrafiche' ;
}
2018-09-24 18:10:16 +02:00
/**
* Restituisce l ' identificativo .
*
* @ return int
*/
public function getIdAttribute ()
{
return $this -> idanagrafica ;
}
public function getPartitaIvaAttribute ()
{
2020-03-06 09:40:56 +01:00
return $this -> attributes [ 'piva' ];
2018-09-24 18:10:16 +02:00
}
public function setPartitaIvaAttribute ( $value )
{
2020-03-06 09:40:56 +01:00
if ( in_array ( $value , [ '99999999999' , '00000000000' ])) {
$value = null ;
}
2018-09-24 18:10:16 +02:00
$this -> attributes [ 'piva' ] = trim ( strtoupper ( $value ));
}
2019-04-19 03:18:05 +02:00
public function setNomeAttribute ( $value )
{
$this -> attributes [ 'nome' ] = trim ( $value );
}
public function setCognomeAttribute ( $value )
{
$this -> attributes [ 'cognome' ] = trim ( $value );
}
2018-09-24 18:10:16 +02:00
public function setCodiceFiscaleAttribute ( $value )
{
$this -> attributes [ 'codice_fiscale' ] = trim ( strtoupper ( $value ));
}
2018-11-09 07:02:59 +01:00
public function setCodiceDestinatarioAttribute ( $value )
{
2019-05-20 11:01:46 +02:00
if ( $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 ));
}
2019-09-13 11:29:45 +02:00
/**
* Restituisce la sede legale collegata .
*
* @ return self
*/
public function getSedeLegaleAttribute ()
{
return $this ;
}
// Relazioni Eloquent
2018-09-24 18:10:16 +02:00
public function tipi ()
{
return $this -> belongsToMany ( Tipo :: class , 'an_tipianagrafiche_anagrafiche' , 'idanagrafica' , 'idtipoanagrafica' );
}
2019-09-13 11:29:45 +02:00
public function nazione ()
{
return $this -> belongsTo ( Nazione :: class , 'id_nazione' );
}
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
2020-02-24 12:21:47 +01:00
public function fattureVendita ()
{
return $this -> fatture () -> whereHas ( 'tipo' , function ( Builder $query ) {
$query -> where ( 'dir' , 'entrata' );
});
}
public function fattureAcquisto ()
{
return $this -> fatture () -> whereHas ( 'tipo' , function ( Builder $query ) {
$query -> where ( 'dir' , 'uscita' );
});
}
2019-09-13 11:29:45 +02:00
public function ordini ()
2018-09-24 18:10:16 +02:00
{
2019-09-13 11:29:45 +02:00
return $this -> hasMany ( Ordine :: class , 'idanagrafica' );
2018-09-24 18:10:16 +02:00
}
2019-09-13 11:29:45 +02:00
public function ddt ()
2018-09-24 18:10:16 +02:00
{
2019-09-13 11:29:45 +02:00
return $this -> hasMany ( DDT :: class , 'idanagrafica' );
2018-09-24 18:10:16 +02:00
}
2019-04-19 03:18:05 +02:00
2019-09-13 11:29:45 +02:00
public function contratti ()
2019-07-19 15:23:00 +02:00
{
2019-09-13 11:29:45 +02:00
return $this -> hasMany ( Contratto :: class , 'idanagrafica' );
}
public function preventivi ()
{
return $this -> hasMany ( Preventivo :: class , 'idanagrafica' );
}
public function dichiarazioni ()
{
return $this -> hasMany ( Dichiarazione :: class , 'id_anagrafica' );
2019-07-19 15:23:00 +02:00
}
2019-07-04 21:03:33 +02:00
// Metodi statici
/**
* Calcola il nuovo codice di anagrafica .
*
* @ return string
*/
public static function getNextCodice ()
{
// Recupero maschera per le anagrafiche
$maschera = setting ( 'Formato codice anagrafica' );
$ultimo = Generator :: getPreviousFrom ( $maschera , 'an_anagrafiche' , 'codice' , [
" codice != '' " ,
2019-07-05 18:29:14 +02:00
'deleted_at IS NULL' ,
2019-07-04 21:03:33 +02:00
]);
$codice = Generator :: generate ( $maschera , $ultimo );
return $codice ;
}
2019-07-05 09:53:53 +02:00
protected function fixRagioneSociale ()
{
if ( ! empty ( $this -> cognome ) || ! empty ( $this -> nome )) {
$this -> ragione_sociale = $this -> cognome . ' ' . $this -> nome ;
}
}
2018-08-09 10:14:26 +02:00
}