- RI: Read Intensive (the cheapest)
- MU: Mixed Use (in the middle).
- WI: Write Intensive (most expensive)
Mese: gennaio 2020
apple id: Cannot Reset Security Questions We don’t have sufficient information to reset your security questions
Scenario: You want to activate 2-factor authentication on your apple id. The system fails and apple support tells you that you have forgotten your security questions. Support suggests you to access https://iforgot.apple.com/ to restore them but when trying to do it the error appears: “Cannot Reset Security Questions We don’t have sufficient information to reset your security questions”
Solution
Usually security questions are requested by the apple device in pairs. There are 5 possible questions and perhaps you are sure of the answer of at least one. Go to https://appleid.apple.com/ and when asked about security questions, choose that you have forgotten them. Now there will be the option to choose a single security question; choose the one you are sure of, answer and update the new security questions.
This procedure was reported to us by the apple support: do not do it if you are not in the same situation
Android java app with notification from asp.net mvc using firebase cloud messaging – part 3
Notification service in Android
Now we need to create in Android the service able to manage the notification incoming from firebase and to show these to user. Follow this usefull article Working easily with FCM push notifications in Android. You’ll have a class like this.
package com.mycompany.myfirstapp;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import androidx.core.app.NotificationManagerCompat;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
//is the class that we can find in the manifest as a service
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public static final String TAG = "MsgFirebaseServ";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String title = "";
String body = "";
String objectId = "";
String objectType = "";
if (remoteMessage.getData() != null) {
title = remoteMessage.getData().get("title");
body = remoteMessage.getData().get("body");
objectId = remoteMessage.getData().get("object_id");
objectType = remoteMessage.getData().get("objectType");
}
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(title)
.setContentText(body)
.build();
NotificationManagerCompat
manager = NotificationManagerCompat.from(getApplicationContext());
manager.notify(/*notification id*/0, notification);
}
}
Run your app on your device
Follow this instruction : https://developer.android.com/training/basics/firstapp/running-app
First test using your app in your device
- Run the app on your device or emulator. The app should had created a new register id for the device and send it to asp.net mvc site. Now the device is registered.
- Open Firebase console, go down in the menu on the left. Open Cloud Messaging session : you should find the possibility to send notification to your device starting from this page. So you can test correct developing of above class.
Send notification from asp.net mvc to firebase
For backend developers. You should create a class to manage notification to firebase. Follow the article Firebase push notifications using a .NET Backend to prepare a class to manage the notification to Firebase.
Then prepare your notification test task in a controller. Something like this :
public Task<bool> NoteAsync()
{
var device = db.RegisteredDevices.Where(d => d.ENABLED == true);
string[] da = new string[device.Count()];
int i = 0;
foreach (RegDevice r in device)
{
da[i] = r.ID;
i++;
}
string serverkey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
return FCMPushNotification.SendPushNotification(da,serverkey,
"Title","body");
}
Firebase messaging, where to get Server Key?
Click the Settings (Cog wheel) icon next to your project name at the top of the new Firebase Console, as per screenshot below:
- Click Project settings.
- Click on the Cloud Messaging tab.
Final test
Call the asp.net mvc method created. You should see a notification in your device.
Android java app with notification from asp.net mvc using firebase cloud messaging – part 1
Android java app with notification from asp.net mvc using firebase cloud messaging – part 2
Links
- add firebase to your android project official
- Firebase console
- Setup a firebase cloud messaging client app on Android
- Part 1 : Token based authentication in ASP.NET Web API
- Firebase push notifications using a .NET Backend
- Firebase messaging, where to get Server Key?
- Java HttpsURLConnection example
- Java HttpsURLConnection example 2
- Working easily with FCM push notifications in Android
- Run your app on your device
Android java app with notification from asp.net mvc using firebase cloud messaging – part 2
In this scenario we looking to send the device registration id to a server with user data to save it in our database.
Token based authentication in ASP.NET Web API
For backend developers. ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad range of clients. Follow the following article in order to implement Token based authentication using ASP.NET Web API 2. (Part 1 : Token based authentication in ASP.NET Web API)
To register the device you need a method like this
[HttpPost]
public HttpResponseMessage Register(string key)
{
var identity = (ClaimsIdentity)User.Identity;
string message = "";
if (!string.IsNullOrEmpty(key))
{
var userid = identity.GetUserId();
RegDevice device = db.RegisteredDevices.Where(d => d.ID == key &&
d.USER == userid).FirstOrDefault();
if (device == null)
{
device = new RegDevice();
device.ID = key;
device.USER = userid;
db.RegisteredDevices.Add(device);
if (db.SaveChanges() > 0)
{
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
message = Vocabolario.ErrorInTemporaryStorage;
//System.Diagnostics.Debug.WriteLine("PostServerLog. erore" +
message);
}
}
}
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "value");
response.Content = new StringContent(message, Encoding.Unicode);
return response;
}
Bearer authentication on Java
For frontend developers. To authenticated in a asp.net mvc site, first of all you have to generate the token using the username and the password. The token will conserve all the user’s data more the validation time. We will use this token to talk to our server.
Getting a token is not a goal per se. It’s a necessary step to call a protected API. The token needs to be used to access a Web API. The way to do it is by setting the Authorization header to be “Bearer”, followed by a space, followed by the access token.
To generate the token you should use something like this :
package com.mycompany.myfirstapp;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.io.InputStream;
import org.apache.wink.json4j.JSONArray;
import org.apache.wink.json4j.JSONObject;
import org.apache.wink.json4j.JSONException;
import java.nio.charset.StandardCharsets;
import java.security.cert.Certificate;
import javax.net.ssl.SSLPeerUnverifiedException;
public class MyServer {
private final static String BASE_URL = "https://www.mysite.com";
private final static String TOKEN_ENDPOINT = BASE_URL + "/token";
private final static String REGDEVICE_ENDPOINT = BASE_URL + "/api/Account/Register";
//pass username and password in this example
public static String getToken(String user, String pwd) throws IOException, JSONException {
byte[] postData = getRequestBodyForAccessToken(user,pwd);
int postDataLength = postData.length;
URL url = new URL(TOKEN_ENDPOINT);
HttpsURLConnection requestConn = (HttpsURLConnection) url.openConnection();
requestConn.setRequestMethod("POST");
requestConn.setDoOutput(true);
requestConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
try (DataOutputStream dos = new DataOutputStream(requestConn.getOutputStream())) {
dos.write(postData);
}
if (requestConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
if (requestConn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM) {
String serverURL = requestConn.getHeaderField("Location");
System.err.println("Set the value of the server path to: " + serverURL);
}
System.err.println("Error in obtaining an access token. " +
requestConn.getResponseMessage());
}
String accessToken;
try (InputStream tokenStream = requestConn.getInputStream()) {
JSONObject tokenRes = new JSONObject(tokenStream);
accessToken = (String) tokenRes.get("access_token");
}
return accessToken;
}
public static void RegisterNewDevice(String deviceKey, String atoken)
{
StringBuilder urlBuilder = new StringBuilder(REGDEVICE_ENDPOINT);
urlBuilder.append("&key=").append(deviceKey);
String pathWithQueryParams = urlBuilder.toString();
InputStream restRegApiStream = null;
try {
HttpsURLConnection restRegApiConn = getRestApiConnection(pathWithQueryParams);
addAuthenticationHeader(restRegApiConnn, atoken);
restRegApiConn.setRequestMethod("POST");
if (restRegApiConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
if (restRegApiConn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
if (restRegApiConn.getHeaderField("www-authenticate").contains("invalid_token")) {
}
} else if (restRegApiConn.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) {
}
} else {
restRegApiStream = restRegApiConn.getInputStream();
}
}
catch(Exception ex)
{
}
}
private static HttpsURLConnection getRestApiConnection(String apiCall) throws IOException {
URL restApiUrl = new URL(apiCall);
HttpsURLConnection restApiURLConnection = (HttpsURLConnection) restApiUrl.openConnection();
return restApiURLConnection;
}
private static void addAuthenticationHeader(HttpsURLConnection restApiURLConnection, String t)
{
restApiURLConnection.setRequestProperty("Authorization", "Bearer " + t);
}
/**
* Get the request body to be used for the POST request when requesting an access token.
*/
private static byte[] getRequestBodyForAccessToken(String user, String pwd) {
StringBuilder sb = new StringBuilder("grant_type=password");
sb.append("&username=")
.append(user)
.append("&password=")
.append(pwd);
return sb.toString().getBytes(StandardCharsets.UTF_8);
}
private static void print_https_cert(HttpsURLConnection con){
if(con!=null){
try {
System.out.println("Response Code : " + con.getResponseCode());
System.out.println("Cipher Suite : " + con.getCipherSuite());
System.out.println("\n");
Certificate[] certs = con.getServerCertificates();
for(Certificate cert : certs){
System.out.println("Cert Type : " + cert.getType());
System.out.println("Cert Hash Code : " + cert.hashCode());
System.out.println("Cert Public Key Algorithm : "
+ cert.getPublicKey().getAlgorithm());
System.out.println("Cert Public Key Format : "
+ cert.getPublicKey().getFormat());
System.out.println("\n");
}
} catch (SSLPeerUnverifiedException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
}
private static void print_content(HttpsURLConnection con){
if(con!=null){
try {
System.out.println("****** Content of the URL ********");
BufferedReader br =
new BufferedReader(
new InputStreamReader(con.getInputStream()));
String input;
while ((input = br.readLine()) != null){
System.out.println(input);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
So now you have registered the device on the server. It’s time to send notification to your device
Android java app with notification from asp.net mvc using firebase cloud messaging – part 1
Android java app with notification from asp.net mvc using firebase cloud messaging – part 3
Links
- add firebase to your android project official
- Firebase console
- Setup a firebase cloud messaging client app on Android
- Part 1 : Token based authentication in ASP.NET Web API
- Firebase push notifications using a .NET Backend
- Firebase messaging, where to get Server Key?
- Java HttpsURLConnection example
- Java HttpsURLConnection example 2
- Working easily with FCM push notifications in Android
- Run your app on your device
Android java app with notification from asp.net mvc using firebase cloud messaging – part 1
Firebase Project
For backend developers.
Follow the document : https://firebase.google.com/docs/android/setup
Important steps : Add Firebase using the Firebase console. After you have a Firebase project, you can add your Android app to it. Enter your app’s package name in the Android package name field. Click Download google-services.json to obtain your Firebase Android config file google-services.json
)
Android app in java
For frontend developers
- Install or update Android Studio to its latest version.
- Make sure that your app meets the following requirements:
- Targets API level 16 (Jelly Bean) or later
- Uses Gradle 4.1 or later
In Android Studio create a new android app using java as language. To enable Firebase products in your app, pass to Project visualization (on the left of android studio) in your root-level Gradle file (build.gradle
), add rules to include the Google Services Gradle plugin. Check that you have Google’s Maven repository, as well.
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
// ...
// Add the following line:
classpath 'com.google.gms:google-services:4.3.3' // Google Services plugin
}
}
allprojects {
// ...
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
// ...
}
}
In your module (app-level) Gradle file (usually app/build.gradle
), apply the Google Services Gradle plugin:
apply plugin: 'com.android.application'
// Add the following line:
apply plugin: 'com.google.gms.google-services' // Google Services plugin
android {
// ...
}
To your module (app-level) Gradle file (usually app/build.gradle
), add the dependencies for the Firebase products that you want to use in your app.
dependencies {
// ...
// Add the SDKs for the Firebase products you want to use in your app
// For example, to use Firebase Authentication and Cloud Firestore
implementation 'com.google.firebase:firebase-analytics:17.2.0'
implementation 'com.google.firebase:firebase-messaging:20.1.0'
// Getting a "Could not find" error? Make sure that you've added
// Google's Maven repository to your root-level build.gradle file
}
Sync your app (at the top on the right of Android Studio) to ensure that all dependencies have the necessary versions.
Set up a Firebase Cloud Messaging client app on Android
For frontend developers. Follow the document : https://firebase.google.com/docs/cloud-messaging/android/client
Edit your app manifest. A service that extends FirebaseMessagingService
. This is required if you want to do any message handling beyond receiving notifications
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mycompany.myfirstapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config"
tools:ignore="GoogleAppIndexingWarning">
<!-- [START fcm_default_icon] -->
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
<!-- [END fcm_default_icon] -->
<!-- [START fcm_disable_auto_init] -->
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
<!-- [END fcm_disable_auto_init] -->
<activity
android:name=".EntryChoiceActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- [START firebase_service] -->
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<!-- [END firebase_service] -->
</application>
</manifest>
Access the device registration token
On initial startup of your app, the FCM SDK generates a registration token for the client app instance.
The registration token may change when:
- The app deletes Instance ID
- The app is restored on a new device
- The user uninstalls/reinstall the app
- The user clears app data.
When you need to retrieve the current token, call FirebaseInstanceId.getInstance().getInstanceId()
: For example
private void GetRegistrationToken()
{
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "getInstanceId failed", task.getException());
return;
}
// Get new Instance ID token
String token = task.getResult().getToken();
regToken = token;
System.out.println("***************");
System.out.println(token);
//
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
//
new Thread(){
public void run(){
try {
//SEND REGISTRATION TOKEN TO BACKEND SERVER
catch (Exception e) {
e.printStackTrace();
}
}
}.start();
//
}
});
}
As you can see above, after get the registration id you need to pass this to your backend server. In this way you will be able to save this data linking it to your user to permit, in the future, to send message only to selected users.
Android java app with notification from asp.net mvc using firebase cloud messaging – part 2
Android java app with notification from asp.net mvc using firebase cloud messaging – part 3
Links
- add firebase to your android project official
- Firebase console
- Setup a firebase cloud messaging client app on Android
- Part 1 : Token based authentication in ASP.NET Web API
- Firebase push notifications using a .NET Backend
- Firebase messaging, where to get Server Key?
- Java HttpsURLConnection example
- Java HttpsURLConnection example 2
- Working easily with FCM push notifications in Android
- Run your app on your device
Problemi delle caselle email molto grandi
La posta elettronica è cambiata molto negli anni: da semplice mezzo di comunicazione è diventato il nostro “contenitore” preferito di informazioni. Conserviamo tutto nella nostra cassetta postale: comunicazioni, contratti ordini, fatture, etc. Queste informazioni devono sempre essere accessibili ovunque noi siamo: non possiamo più vederle solo dalla nostra postazione di lavoro ma anche attraverso il nostro smartphone.
Le aziende e gli utenti chiedono ai Provider caselle email di dimensioni sempre maggiori. In azienda l’email è e rimane il principale mezzo sia di comunicazione ma, oggi, anche il principale strumento per archiviare i file. Conserviamo tutte le email che riceviamo con allegati di qualsiasi dimensione; conserviamo anche tutte le email che inviamo anche se contengono allegati che abbiamo prelevato dal nostro stesso computer.
Il motivo è che inviare un file via email è semplice, veloce e comodo, inoltre quel file rimarrà per sempre nella casella dell’utente, che così potrà averlo sempre a portata di mano. Sarebbe stato meglio spostare il file su un server di rete o utilizzare in azienda servizi di cloud storage , ma l’email rimane il metodo più immediato.
L’altro motivo per cui le email crescono sempre è che gli utenti non sentono il bisogno di fare spazio nella propria casella email, magari cancellando i messaggi che non servono più o semplicemente svuotando il cestino.
Ma quali sono i problemi di una caselle email di grandi dimensioni?
Il primo sono i tempi di avvio del proprio programma per leggere le email, ad esempio Microsoft Outlook diventa sempre più lento man mano che la caselle email diventa più grande.
Un altro problema è che non tutti i fornitori di web e email hosting forniscono caselle email di grandi dimensioni, molti non vanno oltre pochi GB di spazio per casella email.
Inoltre una casella email di grandi dimensioni diventa onerosa da gestire anche lato server il che la rende lenta nell’accesso e nelle ricerche.
Quali sono invece i limiti di dimensione che una casella email può raggiungere?
La documentazione ufficiale di Microsoft Outlook dichiara che le prestazioni di Outlook iniziano a peggiorare non appena il file di archivio delle email OST supera i 10GB. Superato i 25GB i problemi di lentezza e blocchi di Outlook aumentano.
Arrivati a 50GB Outlook smette di funzionare in quanto questa è la dimensione massima che può raggiungere un file PST, ed è necessario eseguire delle operazioni di manutenzione, con conseguente fermo del lavoro dell’utente.
Lato server, ovvero per il fornitore del servizio di email hosting, non ci sono limiti veri e propri di dimensione ad una casella email, ma potrebbero esserci dei problemi nell’indicizzazione e nell’archiviazione di caselle email molto grandi.
il nostro servizio di gestione email
Mecdata in collaborazione con il partner Qboxmail offre un servizio di gestione email professionale:
- Casette postali di diverse dimensioni/costi per rispondere a qualsiasi esigenza : 4GB, 8GB, 25GB, 50GB
- Cassetta postale sempre aggiornata e uguale in ogni istante su ogni vostro dispositivo : computer, notebook, tablet, smartphone
- Webmail, sviluppata ed ottimizzata per gestire caselle di grandi dimensioni
Sei interessato ? CHIAMACI ALLO 051.790428 OPPURE SCRIVI A info@mecdata.it
Mekerp: reverse charge
Il reverse charge è un particolare meccanismo di applicazione dell’imposta sul valore aggiunto, per il quale il cliente paga l’imposta al posto del fornitore
In questa simulazione noi siamo il cliente che riceve la fatture in RC.
FATTURA DI ACQUISTO
La registrazione di una fattura in RC nel Mekerp avviene normalmente usando il normale modello contabile per le fatture di acquisto. Nella registrazione viene inserito l’imponibile e selezionato un tipo di iva “con reverse charge”.
Si salva la registrazione e si può subito vedere il primo effetto di questa inversione contabile : noi non dovremo dare al fornitore il valore dell’importo, bensì il solo valore dell’imponibile perché il valore dell’imposta la pagheremo noi. Quindi nella parte finanziaria avremo una scadenza che ci ricorda che dobbiamo dare al fornitore il solo imponibile.
Per essere voi a pagare l’iva per conto del vostro fornitore dovrete fare a lui una fattura, generando così una iva a debito che andrà quindi a compensare l’iva del vostro fornitore.
Questa operazione nel Mekerp è totalmente automatica.
LEGAME FORNITORE – CLIENTE
Nella registrazione della fattura di acquisto in basso a destra vedete il pulsante “AUTOFATTURA”.
Se questo pulsante non è abilitato è necessario legare al fornitore un corrispettivo codice cliente: in pratica dovete avere un cliente che ha i dati fiscali uguali al vostro fornitore (ricordate che dobbiamo fare una fattura al fornitore e quindi gestirlo come un cliente). Se non lo avete, create il nuovo cliente. Andate quindi nella anagrafica del fornitore, in “Dati 2” e inserite nel campo “Cliente collegato” il numero del cliente che avete generato. Ora vedrete che il pulsante “AUTOFATTURA” è attivo. Per avere il pulsante autofattura attivo è necessario quindi avere per ogni fornitore che gestisce il RC, il suo corrispettivo cliente.
AUTOFATTURA
Spingete il pulsante AUTOFATTURA.
In automatico il gestionale genera una fattura al cliente ed un registrazione di compensazione. La fattura di vendita seguirà la vostra normale numerazione.
Ecco quindi le registrazioni contabile che il Mekerp esegue per conto vostro.
DARE | AVERE | ||
FATTURA DI ACQUISTO | 120 | CONTO FORNITORE | |
FATTURA DI ACQUISTO | 100 | CENTRO DI COSTO | |
FATTURA DI ACQUISTO | 20 | IVA ACQUISTI | |
DARE | AVERE | ||
FATTURA DI VENDITA | 120 | CONTO CLIENTE | |
FATTURA DI VENDITA | 100 | CENTRO DI RICAVO | |
FATTURA DI VENDITA | 20 | IVA VENDITE | |
DARE | AVERE | ||
COMPENSAZIONE | 120 | CONTO CLIENTE | |
COMPENSAZIONE | 100 | CENTRO DI RICAVO | |
COMPENSAZIONE | 20 | CONTO FORNITORE |
Queste registrazioni portano quindi ad un valore totale dei conti semplificabile come di seguito
DARE | AVERE | TOTALE | |
CONTO FORNITORE | 20 | 120 | 100 |
CENTRO DI COSTO | 100 | 100 | |
IVA ACQUISTI | 20 | 20 | |
CONTO CLIENTE | 120 | 120 | 0 |
CENTRO DI RICAVO | 100 | 100 | 0 |
IVA VENDITE | 20 | 20 |
Il totale dell’iva si compensa, il fornitore rimane esposto per solo il valore dell’imponibile e la fattura di vendita non genera alcun ricavo.