direcciones...

This commit is contained in:
Mireya Serrano 2026-05-24 18:25:10 +02:00
parent f4cf440ff0
commit 877cb594b2
4 changed files with 59 additions and 5 deletions

View File

@ -141,7 +141,22 @@ public class DolibarrClient {
} }
if (matches != null && !matches.isEmpty()) { if (matches != null && !matches.isEmpty()) {
return matches.get(0); DolibarrThirdpartyDto existing = matches.get(0);
if (address != null && (existing.address() == null || existing.address().isBlank())) {
DolibarrThirdpartyDto updated = new DolibarrThirdpartyDto(
existing.id(), existing.name(), existing.email(), existing.client(),
existing.codeClient(), address, zip, city, existing.idCountry(), existing.phone());
restClient.put()
.uri("/thirdparties/{id}", existing.id())
.body(updated)
.retrieve()
.toBodilessEntity();
return restClient.get()
.uri("/thirdparties/{id}", existing.id())
.retrieve()
.body(DolibarrThirdpartyDto.class);
}
return existing;
} }
log.debug("Thirdparty not found, creating for email={}", email); log.debug("Thirdparty not found, creating for email={}", email);
@ -245,8 +260,8 @@ public class DolibarrClient {
* *
* @param order the created order (must have {@code id}, {@code socid}, and {@code lines}) * @param order the created order (must have {@code id}, {@code socid}, and {@code lines})
*/ */
public DolibarrInvoiceDto createInvoiceFromOrder(DolibarrOrderDto order) { public DolibarrInvoiceDto createInvoiceFromOrder(DolibarrOrderDto order, Integer fkAddress) {
log.debug("Creating Dolibarr invoice from orderId={}", order.id()); log.debug("Creating Dolibarr invoice from orderId={} fkAddress={}", order.id(), fkAddress);
List<DolibarrInvoiceDto.InvoiceLine> invoiceLines = order.lines() == null List<DolibarrInvoiceDto.InvoiceLine> invoiceLines = order.lines() == null
? List.of() ? List.of()
@ -264,6 +279,7 @@ public class DolibarrClient {
DolibarrInvoiceDto invoiceBody = DolibarrInvoiceDto.builder() DolibarrInvoiceDto invoiceBody = DolibarrInvoiceDto.builder()
.fkCommande(order.id()) .fkCommande(order.id())
.socid(order.socid()) .socid(order.socid())
.fkAddress(fkAddress)
.lines(invoiceLines) .lines(invoiceLines)
.build(); .build();

View File

@ -20,6 +20,8 @@ public record DolibarrInvoiceDto(
Integer socid, Integer socid,
/** Linked order internal ID */ /** Linked order internal ID */
@JsonProperty("fk_commande") Integer fkCommande, @JsonProperty("fk_commande") Integer fkCommande,
/** Billing address (llx_socadresse ID); null = use thirdparty main address */
@JsonProperty("fk_address") Integer fkAddress,
/** 0 = draft, 1 = validated, 2 = paid, 3 = abandoned */ /** 0 = draft, 1 = validated, 2 = paid, 3 = abandoned */
Integer statut, Integer statut,
List<InvoiceLine> lines List<InvoiceLine> lines

View File

@ -21,6 +21,7 @@ public record PrestashopOrderDto(
@JsonProperty("total_shipping") String totalShipping, @JsonProperty("total_shipping") String totalShipping,
/** PrestaShop order state ID */ /** PrestaShop order state ID */
@JsonProperty("current_state") String currentState, @JsonProperty("current_state") String currentState,
@JsonProperty("id_address_invoice") String idAddressInvoice,
Associations associations Associations associations
) { ) {

View File

@ -134,8 +134,9 @@ public class OrderSyncService {
DolibarrOrderDto createdOrder = dolibarrClient.createOrder(orderDto); DolibarrOrderDto createdOrder = dolibarrClient.createOrder(orderDto);
// 3. Create linked invoice with lines copied from the order // 3. Create linked invoice with lines copied from the order and billing address
DolibarrInvoiceDto invoice = dolibarrClient.createInvoiceFromOrder(createdOrder); Integer fkAddress = resolveInvoiceAddress(psOrder, customer.id());
DolibarrInvoiceDto invoice = dolibarrClient.createInvoiceFromOrder(createdOrder, fkAddress);
// 4. Persist mapping to prevent re-import // 4. Persist mapping to prevent re-import
orderMappingRepository.save(OrderMapping.builder() orderMappingRepository.save(OrderMapping.builder()
@ -279,6 +280,40 @@ public class OrderSyncService {
} }
} }
private Integer resolveInvoiceAddress(PrestashopOrderDto psOrder, Integer dolibarrThirdpartyId) {
String addrId = psOrder.idAddressInvoice();
if (addrId == null || addrId.isBlank() || "0".equals(addrId)) return null;
// If billing addr = customer default addr → already on thirdparty, no fk_address needed
boolean isGuest = psOrder.idCustomer() == null
|| psOrder.idCustomer().isBlank()
|| "0".equals(psOrder.idCustomer());
if (!isGuest) {
try {
PrestashopCustomerDto c = prestashopClient.getCustomer(Integer.parseInt(psOrder.idCustomer()));
if (c != null && addrId.equals(c.idDefaultAddress())) return null;
} catch (Exception e) {
log.warn("Could not fetch PS customer for invoice address resolution: {}", e.getMessage());
}
}
// Find matching Dolibarr socaddress by content
try {
PrestashopAddressDto billing = prestashopClient.getAddress(Integer.parseInt(addrId));
if (billing == null) return null;
String formatted = formatAddress(billing.address1(), billing.address2());
return dolibarrClient.getThirdpartyAddresses(dolibarrThirdpartyId).stream()
.filter(a -> a.address() != null && a.address().equals(formatted)
&& a.city() != null && a.city().equals(billing.city()))
.map(DolibarrAddressDto::id)
.findFirst()
.orElse(null);
} catch (Exception e) {
log.warn("Could not resolve billing address for PS order {}: {}", psOrder.id(), e.getMessage());
return null;
}
}
private String formatAddress(String addr1, String addr2) { private String formatAddress(String addr1, String addr2) {
if (addr1 == null || addr1.isBlank()) return null; if (addr1 == null || addr1.isBlank()) return null;
if (addr2 == null || addr2.isBlank()) return addr1; if (addr2 == null || addr2.isBlank()) return addr1;